给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
思路:类似于9*9乘法口诀表逐层减一的操作,即如下例子所示(输入n=4,k=2)
1分别对应2,3,4
2分别对应3,4
3对应4
然后把每种组合组合起来即可,这里采用递归的解法,每次都从i=start调用到i=(end-k+1),这里初始化传入的start=1,end=n。当k==0时表示已经不能再分,所以把结果放入res中。
参考代码:
class Solution {
public:
void combineCore(int start, int end, int k, vector<vector<int>> &res, vector<int> tmp) {
if ((end - start + 1) < k) {
return;
}
if (k == 0) {
res.push_back(tmp);
return;
}
for (int i = start; i <= (end - k + 1); i++) {
tmp.push_back(i);
combineCore(i + 1, end, k - 1, res, tmp);
tmp.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> tmp;
combineCore(1, n, k, res, tmp);
return res;
}
};