leetcode——78.子集

时间:2020-07-30 13:20:39   收藏:0   阅读:65

递归

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

原文:https://www.cnblogs.com/taoyuxin/p/13402925.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!