zoukankan      html  css  js  c++  java
  • 78. Subsets 求所有子集(有重复就continue)

    [抄题]:

    Given a set of distinct integers, nums, return all possible subsets (the power set).

    Note: The solution set must not contain duplicate subsets.

    Example:

    Input: nums = [1,2,3]
    Output:
    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    [一句话思路]:

    排序也行,但最好还是排一下

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. backtracing函数是需要来回迭代的。每次不是从0开始,是从start开始,start也是要反复换的 要变成i + 1
    2. 主函数中和backtrace函数中,第一回添加tempList 需要new一个新的

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    第一次用的东西都要new一个新的

    [复杂度]:Time complexity: O(2^n like word break, each numbe can be added or not) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    背诵backtracing的模板,具体实现如下:

    class Solution {
        public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        backtrack(list, new ArrayList<>(), nums, 0);
        return list;
    }
    
    private void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){
        list.add(new ArrayList<>(tempList));
        for(int i = start; i < nums.length; i++){
            tempList.add(nums[i]);
            System.out.println("add了nums1[i]="+nums[i]);//
            System.out.println("扩大的tempList.size1() ="+tempList.size());//
            System.out.println("-------------");//
            
            backtrack(list, tempList, nums, i + 1);
            
            System.out.println("要remove nums2[i]="+nums[i]);//
            tempList.remove(tempList.size() - 1);
            System.out.println("缩小的tempList.size2() ="+tempList.size());//
            System.out.println("-------------");//
        }
    }
    }

     

    add了nums1[i]=1
    扩大的tempList.size1() =1
    -------------
    add了nums1[i]=2
    扩大的tempList.size1() =2
    -------------
    add了nums1[i]=3
    扩大的tempList.size1() =3
    -------------
    要remove nums2[i]=3
    缩小的tempList.size2() =2
    -------------
    要remove nums2[i]=2
    缩小的tempList.size2() =1
    -------------
    add了nums1[i]=3
    扩大的tempList.size1() =2
    -------------
    要remove nums2[i]=3
    缩小的tempList.size2() =1
    -------------
    要remove nums2[i]=1
    缩小的tempList.size2() =0
    -------------
    add了nums1[i]=2
    扩大的tempList.size1() =1
    -------------
    add了nums1[i]=3
    扩大的tempList.size1() =2
    -------------
    要remove nums2[i]=3
    缩小的tempList.size2() =1
    -------------
    要remove nums2[i]=2
    缩小的tempList.size2() =0
    -------------
    add了nums1[i]=3
    扩大的tempList.size1() =1
    -------------
    要remove nums2[i]=3
    缩小的tempList.size2() =0
    -------------

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    有重复:排序+continue

    [LC给出的题目变变变]:

     [代码风格] :

    class Solution {
        public List<List<Integer>> subsetsWithDup(int[] nums) {
            //ini: sort
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            Arrays.sort(nums);
            
            //cc
            if (nums == null || nums.length == 0) return res;
            
            //dfs
            backtrace(nums, new ArrayList<>(), 0, res);
            
            //return
            return res;
        }
        
        //dfs
        public void backtrace(int[] nums, List<Integer> tempList, int start, List<List<Integer>> res) {
            //res.add(tempList);
            res.add(new ArrayList<>(tempList));
            for (int i = start; i < nums.length; i++) {
                if (i > start && nums[i] == nums[i - 1]) continue;
                tempList.add(nums[i]);
                backtrace(nums, tempList, i + 1, res);
                tempList.remove(tempList.size() - 1);
            }
        }
    }
    View Code

     

     

  • 相关阅读:
    OM退货接收设置
    分享一个基于D3.js的互动可重用图表javascript类库 NVD3.js
    免费资源下载:12个漂亮简洁的web背景图案
    分享最新收集的免费photoshop笔刷
    免费素材下载:生态相关的矢量图标集
    分享最新收集的免费photoshop笔刷
    最新的wordpress3.4都有什么新特性
    免费素材下载:学校学院相关图标集
    Adobe开发的基于web的开源代码编辑器 Brackets
    GBin1在线实例帮助你更好的了解jQuery功能特性(三)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8998560.html
Copyright © 2011-2022 走看看