题目描述
给定两个整数n,k,返回[1,n]中所有k个数的组合。
样例
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
算法1
(暴力枚举)
组合和子集差不多,是子集集合的子集。即选择k个数构成的子集。
所以仍然是考虑每个元素选不选两种选择。注意到,当set内的元素大于k时,其后面元素选与不选都不会是正确答案,所以可以将其剪枝去掉。同时,如果set内元素加上剩下全选也达不到k,则这种的后续选择也不会正确,所以也可以将其减去。
C++ 代码
class Solution {
public:
vector<vector<int>> ans;
vector<int> set;
int k,n;
vector<vector<int>> combine(int _n, int _k) {
n = _n;
k = _k;
dfs(1);
return ans;
}
void dfs(int idx){
// 如果set内选中的元素大于k了,或者set内元素个数加上剩下所有元素都选都达不到k,则将这种情况剪枝减去。
if(set.size() > k || set.size() + n - idx + 1 < k) return;
// 由于是从1开始选择的,所有到n+1
if(idx == n + 1){
ans.push_back(set);
return;
}
// 不选idx这个数
dfs(idx + 1);
// 选择idx这个数
set.push_back(idx);
dfs(idx + 1);
set.pop_back();
}
};