回溯本质上是靠递归实现的一种暴力搜索。基本思想是:尝试,如果不满条件就回溯,继续尝试,不满足就回溯,……如此反复,知道搜索完所有的解空间。尝试代表着一次选择,可以基于不同选择展开成多个解空间(树),到达叶子节点则代表找到一组解,但此时算法并未终结,依旧要向上回溯去尝试其他的解,直到遍历所有的可能情况。回溯有一个好处是可以剪枝,通过约束条件,去除不可能的尝试(解空间),缩小搜索范围。
回溯、动规、贪心之间的关系:
回溯是一种能保证不重复且不遗漏的暴搜实现方法。基本所有的问题都可以通过回溯解决。但它有较高的时间复杂度。当问题满足动态规划的三个条件时,就可以用动规代替回溯,提高效率。当问题满足贪心的条件时,又可以进一步用贪心来高效求解。
递归的题目:
77.组合(组合问题)
78.子集(子集问题)
90. 子集 II(子集问题)
46.全排列(排列问题)
51.N皇后(N皇后问题)
131.分割回文串(分割问题)
以下皆为leetcode中笨猪爆破组的回答
回溯、递归、动态规划的区别:
递归是一种结构,即自己调用自己。
回溯是利用递归实现暴搜
动态规划最初是用递归和转移关系用最优子结构推出当前最优。但由于有很多子结构重复计算,所以额外用一定空间来保存最优子结构的解,即加入了“记忆性”。