zoukankan      html  css  js  c++  java
  • 子集 II(力扣第91题)

    题目:

      给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

      说明:解集不能包含重复的子集。

    示例:

    输入: [1,2,2]
    输出:
    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]

    分析:

      需要注意的就是给定的数组中存在重复的元素,然后要求找出的所有子集都是唯一的,不能含有重复的子集。由于数组中可能存在重复的元素,所以可能会造成求出的子集重复,因为集合是无序的,只要含有的元素相同那就是相同的集合,所以为了达到去重的目的,先对给定的数组nums进行一个排序,然后再进行搜索,这就保证了值小的元素不会出现在值大的元素的搜索路径的后面,避免了无序可能造成的子集重复。

    实现代码如下:

    public List<List<Integer>> subsetsWithDup(int[] nums) {
    
            if(nums.length == 0 || nums == null){
                return new ArrayList<>();
            }
            resList = new ArrayList<>();
            resList.add(new ArrayList<>());
            Arrays.sort(nums);
            List<Integer> curlist = new ArrayList<>();
    
            findsubsets(curlist,0,nums);
    
            return resList;
        }
        int lastnum = Integer.MIN_VALUE;
        private void findsubsets(List<Integer> curlist,int s,int[] nums){
    
            if (curlist.size() == nums.length){
    
                return;
            }
    
            for (int i = s; i < nums.length; i++) {
    
                if (nums[i] != lastnum){
                    curlist.add(nums[i]);
                    resList.add(new ArrayList<>(curlist));
                    findsubsets(curlist,i+1,nums);
                    lastnum = curlist.get(curlist.size()-1);
                    curlist.remove(curlist.size()-1);
                }
    
            }
        }
  • 相关阅读:
    Spring Boot整合Freemarker
    Spring Boot异常处理
    CSAPP缓冲区溢出攻击实验(下)
    SparkSQL基础应用(1.3.1)
    程序员的自我修养:(1)目标文件
    CSAPP缓冲区溢出攻击实验(上)
    Redis源码学习:字符串
    六星经典CSAPP-笔记(7)加载与链接(上)
    Redis源码学习:Lua脚本
    六星经典CSAPP-笔记(10)系统IO
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13363383.html
Copyright © 2011-2022 走看看