Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
Example:
Input: n = 4, k = 2
Output:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
代码如下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int> > result;
vector<int> out;
combine(n, 1, k, result, out);
return result;
}
void combine(int n, int num, int k, vector<vector<int> >& result, vector<int>& out) {
if(out.size() == k) {
result.push_back(out);
return;
}
for(int i = num; i <= n; i++) {
out.push_back(i);
combine(n, i + 1, k, result, out);
out.pop_back();
}
}
};
非递归解法
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> out(k, 0);
int i = 0;
while (i >= 0) {
++out[i];
if (out[i] > n) --i;
else if (i == k - 1) res.push_back(out);
else {
++i;
out[i] = out[i - 1];
}
}
return res;
}
};