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);
                }
    
            }
        }
  • 相关阅读:
    单片机数字滤波的算法!
    Python中列表的兄弟
    史上最全的Python程序员面试必备常用问题
    新人在学习web前端的容易踩哪些坑?
    linux+arm系统学习与基础学习
    C和C++笔记:动态内存管理
    Python 爬虫干货之urllib库
    单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系!
    单片机死机了怎么办?
    单片机各种复位电路原理
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13363383.html
Copyright © 2011-2022 走看看