回溯法第一波总结,已经总结了回溯法的基本操作,及程序描述套路。第二波讲一讲一些具体情况。分别从力扣上以下八道题进行总结。

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:

相关文章: