LeetCode总结(三)回溯法
常规排列组合问题
- 所有模板我们都把循环放到backtrace内!主函数内没有循环,也不用pasted.push_back()和pop_back(),都放到backtrace中
- LeetCode 46 全排列
- 给定一个数组,输出所有数字构成的全排列
- 典型题,作为很多其他回溯法题型的模板
- LeetCode 78 幂集
- 简单,与46完全相同,但将所有pasted都放进ans中
- LeetCode 77 组合
- 两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合
- 在主函数中从start = -1处开始遍历
- LeetCode 40 组合总和2
- 给定一个数组,输出组合的总和为target的所有组合
- 由于数字不能重复使用,因此去重比较简单,只需要循环进入所有分支时,如果当前分支与前一个分支元素相同,则continue(i = start+1时例外)
- LeetCode 39 组合总和
- 与40题相比,这里的数字可以重复使用,因此循环进入所有分支时,从i = start处开始即可
- 与40题相比,这里的数字可以重复使用,因此循环进入所有分支时,从i = start处开始即可
- LeetCode 47 全排列2
- 在46题的基础上,增加了条件:数组中存在重复的数字,如何得到全排列?
- 看起来给去重增加了困难,其实解决非常简单!只需要在循环所有分支并进入时,在进入前判断是否与上一个分支相同, continue的条件如下:
- i != 0
- a[i] == a[i-1]
- visited[i-1] == false 在前面的数字必然是已经被检查过了的!如果visited[i-1]==0说明整个子分支都已经遍历过了,所以当前结点与这个结点相邻又相等,可以剪去
- LeetCode 90 子集2
- 与47题完全相同,跳过相邻重复且检查过了的结点
使用回溯法的遍历、搜索问题
- LeetCode 17 电话号码的字母组合
- LeetCode 22 生成有效括号
上面两道题都是一个模式:backtrace(pasted, remain, ...),其中pasted是已经得到的模式,remain为还需要回溯的所有可能
接下来考虑二维grid上的搜索/查找所有可行组合的问题,这才是回溯法的主要应用
- LeetCode 79 二维棋盘格上搜索匹配单词
- 这道题是一个存在性问题,只要搜索到一个满足条件的答案就让整个命题为真,与需要求出所有满足条件的情况不同,backtrace需要返回一个bool值,这个值是所有分支的backtrace的返回值的逻辑或
- LeetCode 51 N皇后

浙公网安备 33010602011771号