题目
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路
1.回溯
2.递归
类似题目leetcode46. 全排列
实现
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> tmp;
vector<vector<int>> res;
vector<int> vec;
for (int i = 1; i <= n; ++i) {
vec.push_back(i);
}
func(&vec, k, &tmp, &res, 0);
return res;
}
void func(vector<int>* vec, int k, vector<int>* tmp, vector<vector<int>>* res, int start) {
if (k == 0) {
res->push_back(*tmp);
} else if (k > 0) {
for (int i = start; i < vec->size(); ++i) {
tmp->push_back((*vec)[i]);
func(vec, k - 1, tmp, res, i + 1);
tmp->pop_back();
}
}
}
};
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> temp;
func(res, temp, 1, n ,k);
return res;
}
void func(vector<vector<int>>& res, vector<int>& temp, int start, int end, int k) {
if (start <= end && k == 1) {
for (int i = start; i <= end; i++) {
temp.push_back(i);
res.push_back(temp);
temp.pop_back();
}
return;
}
for (int i = start; i <= end - k + 1; i++) {
temp.push_back(i);
func(res, temp, i + 1, end, k - 1);
temp.pop_back();
}
}
};