给定一个可能具有重复数字的列表,返回其所有可能的子集。
样例 1:
输入:[0]
输出:
[
[],
[0]
]
样例 2:
输入:[1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
class Solution {
public:
/**
* @param nums: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
vector<vector<int>> subsetsWithDup(vector<int> &nums) {
// write your code here
vector<vector<int>> result;
set<vector<int>> judge;
sort(nums.begin(),nums.end());
vector<int>temp;
cursion(nums,0,result,temp,judge);
return result;
}
void cursion(vector<int>&nums,int k,vector<vector<int>> &result, vector<int>temp,set<vector<int>> &judge)
{
if(k>nums.size()) return;
if(!judge.count(temp))
{
result.push_back(temp);
judge.insert(temp);
}
for (int i = k; i < nums.size(); i++) {
/* code */
temp.push_back(nums[i]);
cursion(nums,i+1,result,temp,judge);
temp.erase(temp.end()-1);
}
}
};