leetcode77.组合
- 题目:
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 - 示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
] - 思路:
回溯思想解决组合问题 - 代码:
回溯法:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
res.clear();
if(n<=0||k<=0||k>n) return res;
vector<int> c;
generateCombinations(n,k,1,c);
return res;
}
private:
vector<vector<int> > res;
void generateCombinations(int n,int k,int start,vector<int>& c){
if(c.size()==k){
res.push_back(c);
return;
}
for(int i=start;i<=n;i++){
c.push_back(i);
generateCombinations(n,k,i+1,c);
c.pop_back();
}
}
};
回溯法的剪枝:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
res.clear();
if(n<=0||k<=0||k>n) return res;
vector<int> c;
generateCombinations(n,k,1,c);
return res;
}
private:
vector<vector<int> > res;
void generateCombinations(int n,int k,int start,vector<int>& c){
if(c.size()==k){
res.push_back(c);
return;
}
//还有k-c.size()个空位,所以,{i....n}中至少要有k-c.size()个元素
//i最多为n-(k-c.size())+1
for(int i=start;i<=n-(k-c.size())+1;i++){
c.push_back(i);
generateCombinations(n,k,i+1,c);
c.pop_back();
}
}
};