Subsets II
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], [] ]
//本题重点是判断何时会出现duplicate的情况 //让结果decrease排列很简单,只要sort nums就好 //结果中出现duplicate是因为前一个相同的数字没有取,但下一个取了 //比如数列 x1 x2 x3 y1 z1 //其中x1 = x2 = x3 != y1 != z1 //如果x1没有取,那么x2也不能取,x3也不能取,否则会出现重复结果。 //如果x1取了,x2可以取也可以不取,如果x2没有取,那么x3也不能取。 //在代码中我们用isLastChosen来表示前一个元素取没取。 //时间复杂度o(2^n) class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> re; vector<int> thisRe; if(nums.empty() == true){ return re; } sort(nums.begin(), nums.end()); _subsetWithDup(re, thisRe, 0, nums, false); return re; } void _subsetWithDup(vector<vector<int>> &re, vector<int> &thisRe, int index, vector<int>& nums, bool isLastChosen){ size_t len = nums.size(); if(index == len){ //finish re.push_back(thisRe); return ; } if(index == 0 || nums[index] != nums[index - 1]){ thisRe.push_back(nums[index]); _subsetWithDup(re, thisRe, index + 1, nums, true); thisRe.pop_back(); _subsetWithDup(re, thisRe, index + 1, nums, false); } else{ //dup, nums[index] == nums[index - 1] if(isLastChosen == true){ thisRe.push_back(nums[index]); _subsetWithDup(re, thisRe, index + 1, nums, true); thisRe.pop_back(); } _subsetWithDup(re, thisRe, index + 1, nums, false); } } };