题目:
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],
]
题意:
给两个数字n和k。找出所有的排列组合,从n个数字里挑k个不同的数字,并且数字按照升序排列。如上面的例子所示。
思路:
对于n个数字,要挑选出k个按顺序排列的数字,采用回溯的方法。每个数字有两种情况即:选中和不被选中。不过需要考虑的是剩下的数字够凑齐k哥数。比如前m个数抽了x个数字,那么还需要抽k-x个数字,现在还剩下n-m个数字,所以必须满足条件n-m >= k-x。
代码如下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
if(n<=0 || k<=0 || k > n)return result;
vector<int> temp;
getAll(n,k,1,result,temp);
return result;
}
void getAll(int n,int k,int curr,vector<vector<int>>& result,vector<int>&temp){
if(k == 0){
result.push_back(temp);
return;
}
temp.push_back(curr);
getAll(n,k - 1,curr + 1, result, temp);//put this element in the result
temp.pop_back();
if(n - curr >= k){
getAll(n, k, curr + 1, result, temp);//ignore this element
}
}
};