题目描述
Given two integers n
and k
, return all possible combinations of k
numbers out of the range [1, n]
.
You may return the answer in any order.
Example 1:
Input: n = 4, k = 2 Output: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
Example 2:
Input: n = 1, k = 1 Output: [[1]]
Constraints:
1 <= n <= 20
1 <= k <= n
解题思路
【C++】
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> comb(k, 0);
int count = 0;
backtracking(res, comb, count, 1, n, k);
return res;
}
void backtracking(vector<vector<int>>& res, vector<int>& comb,
int& count, int pos, int n, int k) {
if (count == k) {
res.push_back(comb);
return;
}
for (int i = pos; i <= n; ++i) {
comb[count++] = i;
backtracking(res, comb, count, i + 1, n, k);
--count;
}
}
};
【Java】
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
Integer[] comb = new Integer[k];
int count = 0;
backtracking(res, comb, count, 1, n, k);
return res;
}
void backtracking(List<List<Integer>> res, Integer[] comb,
int count, int pos, int n, int k) {
if (count == k) {
res.add(new ArrayList<Integer>(Arrays.asList(comb)));
return;
}
for (int i = pos; i <= n; ++i) {
comb[count++] = i;
backtracking(res, comb, count, i + 1, n, k);
--count;
}
}
}
参考文献