【DFS回溯】77. 组合
未优化剪枝版:
class Solution {
public:
void dfs(vector<bool> &record, vector<int> &cur, int index){
if(cur.size() == kk)
result.emplace_back(cur);
else{
for(int i=index; i<=nn;++i)
if(!record[i]){
record[i] = true;
cur.push_back(i);
dfs(record, cur, i + 1);
cur.pop_back();
record[i] = false;
}
}
}
vector<vector<int>> combine(int n, int k) {
nn = n;
kk = k;
vector<int> cur_num;
vector<bool> record(n, false);
dfs(record, cur_num, 1);
return result;
}
private:
vector<vector<int>> result;
int nn;
int kk;
};
优化剪枝:
class Solution {
public:
void dfs(vector<int> &cur, int index){
if(cur.size() == kk)
result.push_back(cur);
else{
for(int i=index; i<=nn - (kk - cur.size()) + 1;++i){
cur.push_back(i);
dfs(cur, i + 1);
cur.pop_back();
}
}
}
vector<vector<int>> combine(int n, int k) {
nn = n;
kk = k;
vector<int> cur_num;
dfs(cur_num, 1);
return result;
}
private:
vector<vector<int>> result;
int nn;
int kk;
};