回溯法,选择集合中所有元素的组合,注意递归的返回条件是 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;
    }
};