回溯法第一波总结,已经总结了回溯法的基本操作,及程序描述套路。第二波讲一讲一些具体情况。分别从力扣上以下八道题进行总结。
17.电话号码的字母组合
题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解题思路:
如下图所示,解题思路是先通过数字字符去对应字符串,然后从每个字符串中提取一个字母进行组合。
all station:需要一个全局的index去遍历每一个字符串,并且for循环是从每个字符串的第一个位置开始走起,与index无直接联系。(是不需要去重剪枝的)
结束条件:当index == 最后一个数字字符对应的字符串。这里不需要别的结束条件,当for循环结束时,自然而然都结束了。
22.括号生成
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路:
通过左右括号不断填充的形式。
all station:分为两种情况:1.填入‘(’,进行回溯;2.填入‘)’,进行回溯
结束条件:当分配的括号数到达2n的时候结束
39.组合总和:
题目:
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 :
输入: candidates =
[2,3,6,7],
target =
7
,
所求解集为:
[
[7],
[2,2,3]
]
解题思路:
题目说数组中的数可以重复选择。所以要如下图进行遍历。
all station:先将目标值减一个元素减到0或者负数,再回溯,去减第二个元素,以此类推。所以需要一个全局index,去初始化for循环中的i,再次递归的时候index的参数应为上一个的i。(因为数组不重复,所以也不需要去重剪枝)
边界条件:当target<0的时候,说明减过头了
结束条件:target == 0时,将temp压入res即可
40.组合总和 II:
题目:
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 :
输入: candidates =
[10,1,2,7,6,1,5]
, target =
8
,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
解题思路:
和上一题类似,因为远数组有重复元素,下图为重复元素产生的原因,以数组{1,2,2,3,4,}为例,第二层第一次是第一个2,,第二层的for循环第二次就会遍历到第二个2,所以就产生了同层重复。所以需要考虑两个情况:1.去重;2.如何遍历
all station:使用for循环进行遍历,需要一个全局index作为i的初始值。每次递归传入的参数是index+1。由于同一层的重复元素(组合不能重复),所以需要去重,if(i-1 >= start && candidates[i] == candidates[i-1]) continue;
边界条件:当target<0时,return
结束条件:当target == 0时,将temp压入res;return
46.全排列:
47.全排列 II:
51.N皇后:
52.N皇后 II: