给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations
方法:递归与回溯。
开始做这道题,主要是在递归参数那里出现问题。有两个点需要注意
在代码注释体现。其中注意点2,一开始我写成l+1,这样会造成,出现[1,2],[2,1]重复的元素。
整个代码的思想,从代码中可以很直观理解。
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
if(n <=0 || k<=0 || k >n ) return res;
findcombine(n,k,1,t);
return res;
}
private:
vector<vector<int>> res;
vector<int> t;
// l代表当前索引位置,l之前的位置将不能再被访问,t保存符合要求的单组res。
void findcombine(int n, int k,int l, vector<int> &t){
if(t.size() == k){
res.push_back(t);
return;
}
// 注意点1:k-t.size()代表还有多少个空位,[i,n]中至少还有k-t.size()个空位
//所以i <= n-(k-t.size())+1,可以做到剪枝操作。
for(int i = l; i <= n-(k-t.size())+1; i++){
t.push_back(i);
findcombine(n,k,i+1,t); // 注意点2:是i+1,而不是l+1。
t.pop_back();
}
return;
}
};