题目描述
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
For example,
If n = 4 and k = 2, a solution is:[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
构造解很简单,就是用一个k-重循环把所有的不重复数字遍历,但是由于k不确定显然不可以写出k重循环的代码所以需要用递归。
考虑到combine(n,k)
可以在k-1的基础上加以构造,只要让i从n到k遍历,求出combine(i-1,k-1)
的解,再把解中的每一项在尾端补上i
,把所有得到的vector都拼接起来即可构造出k的解。得到递归关系后就需要寻找初始条件,显然在k=1
的情况下,解就是1-n
的每个数构成的vector。
最终代码如下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
if (n<k) return result;
if(k==1) {
for(int i=0; i<n; i++) {
vector<int> tmp={i+1};
result.push_back(tmp);
}
return result;
}
for(int i=k-1; i<n; i++) {
vector<vector<int>> tmp = combine(i, k-1);
for(int j=0; j<tmp.size(); j++) tmp[j].push_back(i+1);
result.insert(result.end(), tmp.begin(), tmp.end());
}
return result;
}
};