回溯法,选择集合中所有元素的组合,注意递归的返回条件是 index > nums.size() 。对于所有的子集还需要进行排序,写lambda表达式,对两个vector进行大小判断。
class Solution {
public:
vector<vector<int>> result{};
vector<int> path{};
void backtrack(const vector<int>& nums, int index){
if(index>nums.size()) return;
result.push_back(path);
for(int i=index;i<nums.size();i++){
path.push_back(nums[i]);
backtrack(nums, i+1);
path.pop_back();
}
}
vector<vector<int> > subsets(vector<int> &S) {
backtrack(S,0);
auto cmp=[](vector<int>& v1,vector<int>& v2){
if(v1.empty()) return true;
else if(v2.empty()) return false;
if(v1.size()<v2.size()) return true;
else if(v1.size()>v2.size()) return false;
else{
for(int i=0;i<v1.size();i++){
if(v1[i]==v2[i]) continue;
else return v1[i]<v2[i];
}
return true;
};
};
sort(result.begin(),result.end(),cmp);
return result;
}
};