要求:从1到n的长度为k的组合
思路:回溯,注意[1,2]和[2,1]重复,所以下次递归要从比上次大的数开始,dfs第一句剩下的数不够填满时剪枝,是时间击败99%关键
class Solution {
public:
vector<vector<int>> v;
vector<int> tmp;
unordered_map<int,int> visited;
void dfs(int &k,int &n,int start){
if(k-tmp.size()>n-start+1)return;
if(tmp.size()==k){
v.push_back(tmp);
return;
}
for(int i=start;i<=n;++i){
if(!visited[i]){
visited[i]=1;
tmp.push_back(i);
dfs(k,n,i+1);
visited[i]=0;
tmp.pop_back();
}
}
}
vector<vector<int>> combine(int n, int k) {
dfs(k,n,1);
return v;
}
};