90. 子集 II
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
分析:
使用for(int i=0;i<(1<<n);i++),枚举全部子集。 i的所有位由0,1组成,根据i在某一位 j 上是否为 1,来判断当前元素是否包括nums[j]. 有问题请仔细阅读代码,其实很简单
对于上述枚举,添加约束条件,去重:
去重的思想和方法同: https://blog.csdn.net/STILLxjy/article/details/83046951
排序后,确保相同的数字严格按照序号的顺序进入,即 当nums[j-1] == nums[j]时,在加入nums[j]时,一定要确保nums[j-1]已经加入了。
AC代码:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
for(int i=0;i<(1<<n);i++)
{
vector<int> tmp;
int t = i;
int f = 1;
for(int j=0;j<n;j++)
{
if((1<<j) & i)
{
if(j == 0) tmp.push_back(nums[j]);
else if(nums[j-1] != nums[j]) tmp.push_back(nums[j]);
else if( (1<<(j-1)) & i) tmp.push_back(nums[j]);
else f = 0;
}
}
if(f) ans.push_back(tmp);
}
return ans;
}
};