2 回溯法——用递归来解决嵌套层数的问题
|
|
肯定可以用暴力方法来解决, 但是当nums数组数量多了的时候, 例如50, 我们需要写 50 层 for循环, 这是个不可能完成的任务.
回溯法模板, 因为一般来说, 用回溯法解决的问题是一个集合, 所以不能直接返回结果, 因此, backtrack 需要将 结果集合( 一个多维数组 )传入进去来维护他, 还有所有的选择, 以及路径.
|
|
|
|
46_全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
|
|
77_组合
给定两个整数
n
和k
,返回范围[1, n]
中所有可能的k
个数的组合。 你可以按 任何顺序 返回答案。 输入:n = 4, k = 2 输出: [ [2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]//解题思路: 一般我们在进行答案的搜索的时候, 都是从小的开始, 先1, 然后2, 并且只找比他大的数 [1,2],[1,3],[1,4],[2,3],[2,4], [3,4]
|
|
|
|
216_组合总和3
找出所有相加之和为
n
的k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
1 2 3 4 5
输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他符合的组合了。
|
|
|
|
- 回溯总是和递归联系在一起的
- 要仔细 分析 回溯 树 每一层是从哪个元素开始的
回溯和递归
3.1 回溯总是和递归联系在一起的
|
|
回溯其实就是不断的调用自身, 直至满足结束条件
3.2 要仔细 分析 回溯 树 每一层是从哪个元素开始的
方法还是上次说过的 画图
3.2.1 全排列——-每个元素不重复
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
分析:
|
|
第一层是全部( 1 2 3 4 ), 第二层是缺一个, 第三层是缺两个
总结起来就是每个元素不重复
|
|
3.2.2 组合
给定两个整数
n
和k
,返回范围[1, n]
中所有可能的k
个数的组合。 你可以按 任何顺序 返回答案。 输入:n = 4, k = 2 输出: [ [2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]//解题思路: 一般我们在进行答案的搜索的时候, 都是从小的开始, 先1, 然后2, 并且只找比他大的数 [1,2],[1,3],[1,4],[2,3],[2,4], [3,4]
|
|
从小的开始, 先1, 然后2, 并且只找比他大的数, 有了3 就不在加入 2
|
|
3.2.3 组合总和
给你一个 无重复元素 的整数数组
candidates
和一个目标整数target
,找出candidates
中可以使数字和为目标数target
的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates
中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为
target
的不同组合数少于150
个。
1 2 3 4 5 6
输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 解释: 2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。 7 也是一个候选, 7 = 7 。 仅有这两种组合。
|
|
3.2.4 组合总和3
找出所有相加之和为
n
的k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
1 2 3 4 5
输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他符合的组合了。
|
|
3.2.5 电话号码的字母组合
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
|
|
去重
|
|
40_组合总和2(重要, 涉及去重,去重使用了排序)
给定一个候选人编号的集合
candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。
candidates
中的每个数字在每个组合中只能使用 一次 。**注意:**解集不能包含重复的组合。
示例 1:
1 2
输入: candidates = [10,1,2,7,6,1,5], target = 8, 输出: [ [1,1,6],[1,2,5],[1,7],[2,6] ]
集合(数组candidates)有重复元素,但还不能有重复的组合.
去重 时, 遇事不决, 直接排序
|
|