LeetCode 77- 组合
题目链接:力扣
题目描述:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
解题思路
- 经典的回溯题目,本题要求我们不能重复取集合。所以我们得额外使用一个startIndex来控制每次取数的开始位置,防止出现重复。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(int n,int k,int startIndex){
//中止条件
if(path.size() == k){
result.push_back(path);
return ;
}
//每次从startIndex开始取,可以防止取重复集合
//这里进行了剪枝操作
for(int i=startIndex;i <= n - (k - path.size()) + 1;i++){
path.push_back(i);//压入元素
backtracking(n,k,i+1);//递归,下一次递归就从i+1开始取,不会再取i以前的了
path.pop_back();//回溯
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
};
总结:
- 这题剪枝操作可以这样理解
-
- 当前取 path.size()
- 还要取k-path.size()
- 我们取数的区间是[i,n],一共有 n-i+1 个数,那么剩下的数一定要大于等于还要取的数即
n-i+1 >= k-path.size() =====》 i<=n-(k-path.size())+1
所以有了如上的剪枝操作,我们每次进行剪枝一般都是在for循环中下功夫