90 Subsets II

原创 2015年11月18日 21:21:59

题目链接:https://leetcode.com/problems/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],
  []
]

解题思路:
这是一道经典的 NP问题。解决办法与 78 Subsets 非常相似。
基本步骤都是:
1. 对数组进行排序
2. 从前往后依次遍历数组中的元素
3. 遍历列表中现存的每个子集,使它们分别加上当前遍历到的数组元素,形成一个个新的子集
4. 列表中的初始子集就是数组遍历到的第一个元素

对这道题来说,不同点在于可能存在重复的元素,使得新生成的子集与原有子集相同。
解决方法:
只对上一轮添加元素后生成的那些新子集添加当前元素(当前元素与上次添加的元素相同)。
因此,需要记录上一轮新添加的子集个数。
或者,在每一轮结束后,若遇到下一个元素与当前元素相同的情况,就把下一轮遍历子集的起始位置设为当前轮未添加新子集前,列表中的子集个数。

附上大神的解答:http://blog.csdn.net/linhuanmars/article/details/24613193

注:
其实这题与 89 Gray Code 也比较像,都是在已有元素的基础上添加东西,新成新的元素。真应该好好总结!

代码实现:

public class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> res = new ArrayList();
        res.add(new ArrayList<Integer>());
        if(nums == null || nums.length == 0)
            return res;
        Arrays.sort(nums);
        int start = 0;
        int n = 0; // 记录上一轮新添加的子集个数
        for(int i = 0; i < nums.length; i ++) {
            int size = res.size();
            if(i > 0 && nums[i - 1] == nums[i])
                start = size - n;
            else
                start = 0;
            n = 0;
            for(int j = start; j < size; j ++) {
                List<Integer> elem = new ArrayList(res.get(j));
                elem.add(nums[i]);
                res.add(elem);
                n ++;
            }
        }
        return res;
    }
}
19 / 19 test cases passed.
Status: Accepted
Runtime: 3 ms

大神的代码:

public class Solution {
    public List<List<Integer>> subsetsWithDup(int[] num) {  
        List<List<Integer>> res = new ArrayList();  
        res.add(new ArrayList<Integer>());  
        if(num==null || num.length==0)  
            return res;  
        Arrays.sort(num);  
        int start = 0;  
        for(int i=0;i<num.length;i++)  
        {  
            int size = res.size();  
            for(int j=start;j<size;j++)  
            {  
                List<Integer> newItem = new ArrayList<Integer>(res.get(j));  
                newItem.add(num[i]);  
                res.add(newItem);  
            }  
            if(i<num.length-1 && num[i]==num[i+1])  
            {  
                start = size;  
            }  
            else  
            {  
                start = 0;  
            }  
        }  
        return res;  
    }  
}
19 / 19 test cases passed.
Status: Accepted
Runtime: 3 ms
版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode 78. Subsets-数组子集|回溯算法

原题链接:78. Subsets 【思路1-Java】回溯算法|递归实现 本解法采用回溯算法实现,回溯算法的基本形式是“递归+循环”,正因为循环中嵌套着递归,递归中包含循环,这才使得回溯比一般的递归和...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016年06月07日 17:04
  • 4009

Subsets II 求有重复元素的集合的子集 @LeetCode

与之前的Subsets题相比,改用HashSet来作为天然的过滤。 package Level4; import java.util.ArrayList; import java.util.A...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月10日 06:17
  • 2406

【LeetCode-面试算法经典-Java实现】【078-Subsets(子集)】

【078-Subsets(子集)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a set of distinct integers, nums, retur...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月03日 07:19
  • 2147

leetcode 90. Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
  • u014568921
  • u014568921
  • 2016年03月12日 19:07
  • 312

【leetcode】90. Subsets II

leetcode, subsets ||, 3种解法
  • zone_programming
  • zone_programming
  • 2016年01月24日 10:31
  • 323

[leetcode 78 & 90, Medium] Subsets I and II

Subsets I and II
  • u012212811
  • u012212811
  • 2013年11月12日 05:57
  • 1039

leetcode 90 Subsets II

leetcode 90 Subsets II c++ Python
  • sxingming
  • sxingming
  • 2016年06月25日 11:09
  • 452

LeetCode 90 Subsets II--In C++

思路: 由于这道题增加了冗余的属性,所以如果用Subset 1中的暴力递归进行求解的话,会浪费很多时间在扫描判断是否有重复值上。因此,类似于全排列的那个题,想到了在之前的基础上添加一个元素即可形成全...
  • sinat_27564919
  • sinat_27564919
  • 2016年06月04日 16:01
  • 206

LeetCode 90 Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets. No...
  • niuooniuoo
  • niuooniuoo
  • 2016年06月01日 13:47
  • 184

LeetCode 78, 90. Subsets i, ii

1. 题目描述 Given a set of distinct integers, nums, return all possible subsets. Note: Element...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年04月15日 08:42
  • 283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:90 Subsets II
举报原因:
原因补充:

(最多只允许输入30个字)