第三周学习

1. 总结

这周学习了泛型递归,分治和回溯,理解起来不是很难,但是做题总是没有思路,递归这块还是有很多好题目,回溯的八皇后就很有意思

2. 知识

2.1 泛型递归

  • 自己调自己
  • 重复性(找最小重复单元)
  • 代码模版

    1. def recursion(level, param1, param2, ...):
    2. # recursion terminator
    3. # 递归终止条件
    4. if level > Max_level:
    5. process_result
    6. return
    7. # process logic in current level
    8. # 处理逻辑
    9. process(level, data...)
    10. # drill down
    11. # 递归调用(下钻)
    12. self.recursion(level+1, p1, p2,...)
    13. # reverse the current level status if needed
    14. # 清理变量,一般不需要,但是不能忘记
  • 思维要点

    1. 不要进行人肉递归(最大误区)
    2. 找到最近最简方法,将其拆解为可重复子问题
    3. 数学归纳法思维

      2.2 分治

  • 也是递归

  • 找重复性
  • 将大问题分解成一个个小问题
  • 将小问题的结果组合成最终结果
  • 代码模版

    1. # Python
    2. def divide_conquer(problem, param1, param2, ...):
    3. # recursion terminator
    4. if problem is None:
    5. print_result
    6. return
    7. # prepare data
    8. data = prepare_data(problem)
    9. subproblems = split_problem(problem, data)
    10. # conquer subproblems
    11. subresult1 = self.divide_conquer(subproblems[0], p1, ...)
    12. subresult2 = self.divide_conquer(subproblems[1], p1, ...)
    13. subresult3 = self.divide_conquer(subproblems[2], p1, ...)
    14. # process and generate the final result
    15. result = process_result(subresult1, subresult2, subresult3, …)
    16. # revert the current level states
  • 思维要点

    • 和递归相比多了中间结果的组合
  • 分治三部曲

    1. 分解:将原问题分解成一系列子问题;
    2. 解决:递归地改善各个子问题,若子问题足够小,则直接克服;
    3. 合并:将子问题的结果合并成原问题。

      2.3 回溯

  • 中心思想

    • 能进则进,进不了则换,换不了则退

image.png

3. 刷题

完成了作业中的两个递归,一个回溯,CPU疼

3.1 236. 二叉树的最近公共祖先

image.png

3.2 105. 从前序与中序遍历构造二叉树

image.png

  • 先序找根,划分左右

    3.3 77.组合

  • 回溯确实有点懵

image.png

  • 剪枝不是很理解