90. Subsets II
问题描述:
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: [1,2,2] Output: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
解题思路:
这道题是78. Subsets的进阶版,即会出现重复
但是要求我们返回的子集里不能有重复。
与Leetcode Combination系列:39 & 77 & 40 & 216 & 17中的40很相似
这里我先用78中的答案运行了一下看了一下与正确答案的不同
e.g.
[1,2,2]
未改进:[[],[1],[1,2],[1,2,2],[1,2],[2],[2,2],[2]]
正确答案:[[],[1],[1,2],[1,2,2],[2],[2,2]]
重复项有[1,2][2]
是因为存在重复的数字2导致的。
所以我们可以加限定,对同一个位置,如果当前数字与前一个数字相同,则跳过
即[1, 2, 2]
确定了[1, ?]在第二个位置我们首先遍历到[2],然后将[1,2]加入返回数组,pop之后又想要加入2,这个时候我们应该跳过来避免重复。
因为在这个位置上这个数字已经出现过一次了
if(i != start && i > 0 && nums[i] == nums[i-1])
continue;
代码:
class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> ret; vector<int> v; sort(nums.begin(),nums.end()); ret.push_back(v); if(nums.empty()) return ret; dfs(ret, 0, v, nums); return ret; } private: void dfs(vector<vector<int>> &ret, int start, vector<int> &v, vector<int> &nums){ if(start >= nums.size()) return; for(int i = start; i < nums.size(); i++){ if(i != start && i > 0 && nums[i] == nums[i-1]) continue; v.push_back(nums[i]); ret.push_back(v); dfs(ret, i+1, v, nums); v.pop_back(); } } };