class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> temp;
sort(nums.begin(),nums.end());
for(int i=0;i<=nums.size();i++){
combine(ret,temp,0,0,i,nums);
}
return ret;
}
void combine(vector<vector<int>> &re,vector<int>& temp,int start,int tempLen,int k,vector<int>& nums){
if(tempLen == k){
re.push_back(temp);
}
for(int i = start;i<nums.size();i++){
temp.push_back(nums[i]);
combine(re,temp,i+1,tempLen+1,k,nums);
temp.pop_back();
while(i<nums.size() - 1 && nums[i] == nums[i+1]){
i++;
}
}
}
};
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> temp;
sort(nums.begin(),nums.end());
for(int i=0;i<=nums.size();i++){
combine(ret,temp,0,0,i,nums);
}
return ret;
}
void combine(vector<vector<int>> &re,vector<int>& temp,int start,int tempLen,int k,vector<int>& nums){
if(tempLen == k){
re.push_back(temp);
}
for(int i = start;i<nums.size();i++){
temp.push_back(nums[i]);
combine(re,temp,i+1,tempLen+1,k,nums);
temp.pop_back();
while(i<nums.size() - 1 && nums[i] == nums[i+1]){
i++;
}
}
}
};