zoukankan      html  css  js  c++  java
  • leetcode 90. 子集 II

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

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

    示例:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/subsets-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    基本思路:与题目leetcode78子集 差不多,由于Java默认的sort函数是从小到大的,所以在求子集的过程中是从后往前的。每cur每次减一(增加一个新数字)产生的新子集是将新数字添加到从finalRes的第ii到第len个元素的并集。如图

    新增加的数字添加到上一部分(框框内)组成下一轮的输出。它有一个范围(即框框内的)下标为[ii,len]。78题则是新添加的数字添加到所有的finalRes元素中。

     1 /**
     2      *
     3      * @param nums:从大到小的有序数组
     4      * @param n:数组长度
     5      * @param cur:当前位置
     6      * @param finalRes:最终结果
     7      * @param i:finalRes起始位置
     8      */
     9     private void result(int[] nums,int n, int cur, List<List<Integer>> finalRes, int i){
    10         if (cur == -1){
    11             return;
    12         }
    13         int len = finalRes.size()-1;
    14         int ii = (nums[cur] != nums[cur+1]) ? 1 : i;
    15         // 当前位置也是一个子集, 故添加
    16         if (nums[cur] != nums[cur+1]) {
    17             List<Integer> elem = new ArrayList<>();
    18             elem.add(nums[cur]);
    19             finalRes.add(elem);
    20         }
    21         for (int j = ii; j <= len; ++j){
    22             List<Integer> e = new ArrayList<>();
    23             e.add(nums[cur]);
    24             e.addAll(finalRes.get(j));
    25             finalRes.add(e);
    26         }
    27         result(nums, n, cur-1, finalRes, len+1);
    28     }
    29 
    30 
    31     public List<List<Integer>> subsetsWithDup(int[] nums) {
    32         // 将数组排序
    33         Arrays.sort(nums);
    34 
    35         List<List<Integer>> res = new ArrayList<>();
    36         List<Integer> elem1 = new ArrayList<>();
    37         res.add(elem1);
    38 
    39         // 生成最后一个重复数字的子集
    40         List<Integer> elem2 = new ArrayList<>();
    41         elem2.add(nums[nums.length-1]);
    42         res.add(elem2);
    43         int i;
    44         for (i = nums.length-2; i >= 0 && nums[i] == nums[i+1]; --i){
    45             List<Integer> e = new ArrayList<>();
    46             e.add(nums[i]);
    47             e.addAll(res.get(res.size()-1));
    48             res.add(e);
    49         }
    50         result(nums, nums.length, i, res, 1);
    51         return res;
    52     }
  • 相关阅读:
    read、readline、readlines和linecache的使用
    无法启用internet连接共享,为LAN连接配置的IP地址需要使用自动IP寻址
    虚拟机pycharm
    Ubuntu安装谷歌浏览器
    pandas dataframe重复数据查看.判断.去重
    git 删除误上传的.idea文件
    python logger日志通用配置文件
    pyinstaller打包python文件成exe(原理.安装.问题)
    SSH 免密登录服务器
    homebrew安装和解决brew安装速度慢的问题
  • 原文地址:https://www.cnblogs.com/yfs123456/p/11574765.html
Copyright © 2011-2022 走看看