题目:
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路:
依旧延续subset 的思路: 每次迭代的集合 = 上一层的集合 + 上一层的集合加入当前层处理的元素。
由于本题目中集合中可能存在重复元素,需要在添加元素前进行判定
1: 如果要添加的元素没有出现过,则把前面所有的集合加上该元素。
2: 如果出该元素属于重复元素,则只添加上一轮中新生成的集合
代码如下:
class Solution {
private:
vector<vector<int>> res;
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
int len = nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>> res(1); // set the first element as null
int last = nums[0], opResNum = 1; // opResNum is the indicator of the existence of repeated element
for (int i = 0; i < len; ++i)
{
if(nums[i] != last)
{
last = nums[i];
opResNum = res.size();
}
int resSize = res.size(); // If there is no repeated element, the resSize equals to opResNum
for (int j = resSize - 1; j >= resSize - opResNum; j-- )
{
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
};