「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
77. 组合
题目描述
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
1 | ini复制代码输入: n = 4, k = 2 |
示例 2:
1 | lua复制代码输入: n = 1, k = 1 |
解析
回溯法就是使用暴力法枚举出所有的可能,递归回溯相辅相成,回溯可以看成一棵树。以本题为例,树的深度为 n , 宽度为 k 。所以横向遍历的次数为 k , 纵向遍历的次数为 n 。
回溯三部曲:
- 1、确定递归函数的参数与返回值
- 求组合数,所以不考虑元素的顺序
- 使用一个数组
vector<int> path
存放每次遍历的结果 - 使用数组
vector<vector<int>> result
存放path
- 使用
int startIndex
来标记递归的每一层遍历开始的索引
- 2、确定终止条件
- 如果
path
已经存入了k
个元素,则终止此次遍历
- 如果
- 3、确定单层递归的逻辑
- 每层遍历时,将遍历的元素加入到
path
中 - 进行回溯
- 每层遍历时,将遍历的元素加入到
代码
1 | c++复制代码class Solution |
剪枝操作
在单层for循环中,如果剩余的元素不足以和已经选取的元素组成K个,那么后面的遍历就是不必要的
- 已经选取元素个数:
path.size()
- 还需要选取元素个数:
k - path.size()
- 所以,遍历的起始索引必须满足
startIndex<=n - (k - path.size())+1
- 修改后的
for
循环:*
1 | c++复制代码for(int i = startIndex;i<=n-(k-path.size())+1;i++) |
216. 组合总和 III
题目描述
找出所有相加之和为 n 的 k 个数的组合 **。 **组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1:
1 | lua复制代码输入: k = 3, n = 7 |
示例 2:
1 | ini复制代码输入: k = 3, n = 9 |
解析
与上面的组合题思路相似,这里是求
k
个数的和等于n
,在判断条件上稍作改动。具体内容查看代码
1 | c++复制代码class Solution |
本文转载自: 掘金