问题描述:
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],
]
基本思想:
回溯法
代码:
vector<int> record; //C++
vector<vector<int> >result;
set<vector<int> > myset;
int kNum = 0;
void addSolution(){
vector<int> tmp(record.begin(),record.end());
sort(tmp.begin(),tmp.end());
if(myset.find(tmp) == myset.end()){
result.push_back(tmp);
myset.insert(tmp);
}
}
void subCombinationSum(vector<int> &cadidates,int bpos,vector<int> &base, int k){
if(kNum == k){
addSolution();
}
int size = cadidates.size();
for(int i = bpos; i < size; i++){
if(base[i] == 1)
continue;
record.push_back(cadidates[i]);
base[i] = 1;
kNum++;
subCombinationSum(cadidates,<span style="color:#FF0000;"><strong>i+1</strong></span>,base,k); //i+1 避免重复
record.pop_back();
base[i] = 0;
kNum--;
}
}
vector<vector<int> > combine(int n, int k) {
vector<int> candidates(n);
for(int i = 0; i < n; i++)
candidates[i] = i+1;
vector<int> base(candidates.size(),0);
subCombinationSum(candidates,0,base,k);
return result;
}