dfs回溯类题目总结

https://leetcode.com/problems/permutations/discuss/18239/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partioning)
题目和解答框架总结。

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

用于求解多阶段决策问题。

先画树形图!!!!

回溯有回到过去的意味,现实世界中不可能,但在算法的世界中可以。

三要素

选择列表
已选路径
终止条件

分析复杂度

时间复杂度

O(N*N!)

空间复杂度

O(N*N!)

剪枝

优化时间复杂度。回溯算法会应用「剪枝」技巧达到以加快搜索速度。有些时候,需要做一些预处理工作(例如排序)才能达到剪枝的目的。预处理工作虽然也消耗时间,但能够剪枝节约的时间更多。

思考

  • dfs,递归,栈之间的关系?
  • 回溯 和 dfs 之间的关系?
  • 回溯 和 动态规划的区别
  • 回到一模一样的过去?中断?函数调用?
  • 为什么不是广度优先遍历

参考

https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/

https://leetcode-cn.com/problems/subsets/solution/c-zong-jie-liao-hui-su-wen-ti-lei-xing-dai-ni-gao-/

你可能感兴趣的:(dfs回溯类题目总结)