90. Subsets II

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.

For example,
If nums = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

解析

从前往后遍历,保留下当前已经计算好的组合集合。对当前i号元素的加入,就是有i和没有i的场景。没有i的场景就是已有的集合。有i的就是对已有的集合追加上i后的集合。两个的并集就是加入i之后的结果。
如果i和上一个元素是重复的,则只需要考虑i-1加入过集合的那部分子集。对于不包含i-1元素的场景来说,这部分子集加入i的结果集,和已有的加入过i-1的结果集是重复的。所有跳过这部分就可以了。


// 90. Subsets II
class Solution_90 {
public:

    void dfs(vector<vector<int>> &res,vector<int> &out,vector<int>&nums,int pos)
    {
        res.push_back(out);

        for (int i = pos; i < nums.size();i++)
        {
            out.push_back(nums[i]);
            dfs(res, out, nums, i + 1);
            out.pop_back();
            while ((i+1)<nums.size()&&nums[i+1]==nums[i])
            {
                i++;
            }
        }
        return;
    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {

        vector<vector<int>> res;
        vector<int> out;
        if (nums.empty())
        {
            return res;
        }
        sort(nums.begin(),nums.end());

        dfs(res, out, nums, 0);

        return res;

    }
};

题目来源

    原文作者:ranjiewen
    原文地址: https://www.cnblogs.com/ranjiewen/p/8810382.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞