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();
        }
    }
};

 

posted @ 2018-06-10 08:50  妖域大都督  阅读(105)  评论(0编辑  收藏  举报