递归与回溯是一起存在的。
回溯是一种暴力搜索。并不高效。
可解决的问题:
1.组合问题
2.切割问题
3.求子集问题
4.排列问题
5.棋盘问题(解数独、N皇后)
2.组合问题
不难,但是自己没写出来。
还需要回头再练。
把握好传入参数、停止条件、单层递归逻辑。
在for里的递归相当于很多层for。
3.组合(优化)
添加了剪枝的操作。
判断范围是否可以缩小,这是一个常见的剪枝操作。
4.组合总和III
自己直接可以写出来,并且进行了剪枝。
但是看过卡尔的视屏之后,还可以进一步进行剪枝。
即对i的范围进行限制。i = index;i <= 9-(k-res.size())+1; i++
5.电话号码的字母组合
看视频后写出来的。常规递归回溯思路。注意全局变量可以先clear一下。
创造一个字典。
7.组合总和
思路和上面的比较相似,但是细节容易错。
8.组合总和II
数层去重
9.分割回文串
设置下标startindex进行切割
并检查各子串是否为回文串
10.复制IP地址
startIndex进行切割,然后检查是否为合法地址
11.子集问题
子集的每个叶子结点都在收获结果
13.子集II
注意树层去重而非树枝去重
14.递增子序列
15.全排列
排列问题
16.全排列II
排列+去重,使用used,去除树层间重复。