• 78. Subsets


    一、题目

      1、审题

      2、分析

        给出一个整数数组,求其所有的不重复的子数组集合。

    二、解答

      1、思路:

        方法一、采用回溯法。

          ①、通过确定子集合数组的元素个数进行元素的字典排列。返回的是字典序的有序序列

    public List<List<Integer>> subsets(int[] nums) {
            
            List<List<Integer>> resultList  = new ArrayList<List<Integer>>();
            int len = nums.length;
            if(len == 0)
                return resultList;
            
            int targetLen = 0;
            while(targetLen <= len) {
                helper2(resultList, new ArrayList<Integer>(), nums, 0, targetLen, len);
                targetLen++;
            }
            
            return resultList;
        }
        
    
        private void helper2(List<List<Integer>> resultList,
                ArrayList<Integer> arrayList, int[] nums, int startIndex, int targetLen, int len) {
            
            if(0 == targetLen) {
                resultList.add(new ArrayList<>(arrayList));
                return;
            }
            
            for(int i = startIndex; i < len; i++) {
                arrayList.add(nums[i]);
                helper2(resultList, arrayList, nums, i+1, targetLen-1, len);
                arrayList.remove(arrayList.size()-1);
            }
        }

      ②、直接将子集合全部返回并进行回溯。

    public List<List<Integer>> subsets2(int[] nums) {
            List<List<Integer>> list = new ArrayList<>();
            Arrays.sort(nums);
            backtrack(list, new ArrayList<Integer>(), nums, 0);
            return list;
        }
    
        private void backtrack(List<List<Integer>> list , ArrayList<Integer> tempList, int [] nums, int start){
            list.add(new ArrayList<>(tempList));    // 所有子集合全部放入
            for(int i = start; i < nums.length; i++){
                tempList.add(nums[i]);
                backtrack(list, tempList, nums, i + 1);
                tempList.remove(tempList.size() - 1);
            }
        }

      方法二、直接创建一个 List 存放所有子集,遍历数组;

          每次向 List 中添加新的子集:即所有已经存在子集中添加此次遍历的元素。

        ①、创建新的临时 List:  List<List<Integer>> tmpResultList

    public List<List<Integer>> subsets4(int[] nums) {
            
            List<List<Integer>> resultList= new ArrayList<>();
            resultList.add(new ArrayList<Integer>());
            
            for(int num: nums) {
                // 新建一个 tmpResultList,防止在遍历 resultList 时对其修改抛出 ConcurrentModificationException 异常
                List<List<Integer>> tmpResultList= new ArrayList<>();
                for(List<Integer> list: resultList) {
                    List<Integer> tmpList = new ArrayList<>(list);
                    
                    tmpList.add(num);
                    tmpResultList.add(new ArrayList<>(tmpList));
                }
                resultList.addAll(tmpResultList);
            }
            return resultList;
        }
        

        ②改进

    public List<List<Integer>> subsets(int[] nums) {
            
            List<List<Integer>> resultList= new ArrayList<>();
            resultList.add(new ArrayList<Integer>());
            
            for(int num: nums) {
                int size = resultList.size();
                for (int i = 0; i < size; i++) {
                    List<Integer> subList = new ArrayList<>(resultList.get(i));
                    subList.add(num);
                    resultList.add(subList);
                }
            }
            
            return resultList;
        }
  • 相关阅读:
    深入比特币原理(四)——锁定脚本(locking script)与解锁脚本(unlocking script)
    深入比特币原理(三)——交易的输入(input)与输出(output)
    深入比特币原理(二)——比特币密钥地址生成
    [JLOI2013]删除物品
    [POI2007]MEG-Megalopolis
    [HNOI2008]遥远的行星
    [JSOI2008]最大数maxnumber
    [HNOI2008]水平可见直线
    [JSOI2008]星球大战starwar
    [HNOI2008]越狱
  • 原文地址:https://www.cnblogs.com/skillking/p/9692124.html
Copyright © 2020-2023  润新知