• 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();
            }
        }
    };
  • 相关阅读:
    习题1
    实验3阅读下面程序、分析说明运行结果,并上机验证。
    实验2利用循环计算n个圆柱体体积。
    实验1编写求圆面积的程序,要求当输入的半径r<=0时,提示输入错误,要求r为浮点型,r的数值是动态的由键盘输入;
    例7-12
    例 7-11
    例7-9
    例7-8
    例7-7
    例7-6
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9162198.html
Copyright © 2020-2023  润新知