zoukankan      html  css  js  c++  java
  • LeetCode——子集 i-ii

    Q:现在有一个没有重复元素的整数集合S,求S的所有子集
    注意:

    • 你给出的子集中的元素必须按非递增的顺序排列
    • 给出的解集中不能出现重复的元素

    例如:
    如果S=[1,2,3], 给出的解集应为:
    [↵ [3],↵ [1],↵ [2],↵ [1,2,3],↵ [1,3],↵ [2,3],↵ [1,2],↵ []↵]

    A:

        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    
        public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
            if (nums.length == 0)
                return res;
            //保证非递增
            Arrays.sort(nums);
            ArrayList<Integer> array = new ArrayList<>();
            for (int i = 0; i < nums.length; i++) {
                //i是这次需要的数量
                DFS(array, i, 0, nums);
            }
            return res;
        }
    
        private void DFS(ArrayList<Integer> array, int count, int start, int[] nums) {
            if (count < 0)
                return;
            else if (count == 0)
                res.add(new ArrayList<>(array));
            else {
                for (int i = start; i < nums.length; i++) {
                    array.add(nums[i]);
                    //从当前的下一个开始,count的数量减一,开始的地方加一
                    DFS(array, count - 1, i + 1, nums);
                    array.remove(array.size() - 1);
                }
            }
        }
    

    Q:给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
    注意:

    • 你给出的子集中的元素要按非递增的顺序排列
    • 给出的解集中不能包含重复的子集

    例如:
    如果S =[1,2,2], 给出的解集应该是:
    [↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]

    A:比上一个多加一个判断条件

        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    
        public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
            if (nums.length == 0)
                return res;
            Arrays.sort(nums);
            ArrayList<Integer> array = new ArrayList<>();
            for (int i = 0; i < nums.length; i++) {
                DFS(array, i, 0, nums);
            }
            return res;
        }
    
        private void DFS(ArrayList<Integer> array, int count, int start, int[] nums) {
            if (count < 0)
                return;
            else if (count == 0)
                res.add(new ArrayList<>(array));
            else {
                for (int i = start; i < nums.length; i++) {
                    if (i > start && nums[i] == nums[i - 1])
                        continue;
                    array.add(nums[i]);
                    DFS(array, count - 1, i + 1, nums);
                    array.remove(array.size() - 1);
                }
            }
        }
    
  • 相关阅读:
    C/C++笔试题
    #include "" 和 #include <> 的区别
    cc、gcc、g++、CC的区别概括
    在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
    vi复制粘贴
    cleartool常用命令
    [转]Tomcat日志详解
    Profile
    Bean的初始化和销毁
    SpringEL和资源调用
  • 原文地址:https://www.cnblogs.com/xym4869/p/12527402.html
Copyright © 2011-2022 走看看