同样是回溯...
回溯模板如下:
void backtrack(...) {
// 递归停止条件
for (int i = begin; i < end; i++) {
// 更新状态
backtrack(...);
// 回退状态
}
} 详细代码如下:
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
sort(S.begin(), S.end());
vector<vector<int> > ans;
int len = S.size();
vector<int> p;
vector<bool> visit(len, false);
for (int i = 0; i <= len; i++) {
backtrack(S, ans, i, p, visit, 0);
}
return ans;
}
void backtrack(vector<int> &S , vector<vector<int> > & ans, int size, vector<int> & path, vector<bool> & v, int begin) {
if (path.size() == size) {
vector<int> p(path);
ans.push_back(p);
return;
}
for (int i = begin; i < S.size(); i++) {
if (!v[i]) {
v[i] = true;
path.push_back(S[i]);
backtrack(S, ans, size, path, v, i+1);
v[i] = false;
path.pop_back();
}
}
}
}; 
京公网安备 11010502036488号