zoukankan      html  css  js  c++  java
  • leetcode——78.子集

    递归

    public List<List<Integer>> subsets(int[] nums) {
            Arrays.sort(nums);
            List<List<Integer>> result = new ArrayList<>();
            List<Integer> path = new ArrayList<>();
            subsets(nums,path,0,result);
            return result;
        }
    
        private void subsets(int[] nums, List<Integer> path, int step, List<List<Integer>> result) {
            if(step == nums.length) {
                result.add(new ArrayList<>(path));
                return;
            }
            subsets(nums,path,step+1,result);
            path.add(nums[step]);
            subsets(nums,path,step+1,result);
            path.remove(path.size()-1);
        }

     位向量法

    public List<List<Integer>> subsets(int[] nums) {
            Arrays.sort(nums);
            List<List<Integer>> result = new ArrayList<>();
            boolean[] selected = new boolean[nums.length];
            subsets(nums,selected,0,result);
            return result;
        }
    
        private void subsets(int[] nums, boolean[] selected, int step, List<List<Integer>> result) {
            if(step == nums.length){
                List<Integer> subset = new ArrayList<>();
                for(int i = 0;i<nums.length;i++){
                    if(selected[i]){
                        subset.add(nums[i]);
                    }
                }
                result.add(new ArrayList<>(subset));
                return;
            }
            selected[step] = false;
            subsets(nums,selected,step+1,result);
            selected[step] = true;
            subsets(nums,selected,step+1,result);
        }

    二进制法

    public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> output = new ArrayList<>();
            int n = nums.length;
    
            for (int i = 1<<n; i < 1<<(n+1); ++i) {
                // generate bitmask, from 0..00 to 1..11
                String bitmask = Integer.toBinaryString(i).substring(1);
    
                // append subset corresponding to that bitmask
                List<Integer> curr = new ArrayList<>();
                for (int j = 0; j < n; ++j) {
                    if (bitmask.charAt(j) == '1') curr.add(nums[j]);
                }
                output.add(curr);
            }
            return output;
        }

     ——2020.7.30

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    idea 中使用 svn
    [剑指offer] 40. 数组中只出现一次的数字
    [剑指offer] 39. 平衡二叉树
    [剑指offer] 38. 二叉树的深度
    [剑指offer] 37. 数字在排序数组中出现的次数
    [剑指offer] 36. 两个链表的第一个公共结点
    [剑指offer] 35. 数组中的逆序对
    vscode在win10 / linux下的.vscode文件夹的配置 (c++/c)
    [剑指offer] 34. 第一个只出现一次的字符
    [剑指offer] 33. 丑数
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13402925.html
Copyright © 2011-2022 走看看