leetcode——78.子集

递归

public List> subsets(int[] nums) {
        Arrays.sort(nums);
        List> result = new ArrayList<>();
        List path = new ArrayList<>();
        subsets(nums,path,0,result);
        return result;
    }

    private void subsets(int[] nums, List path, int step, List> 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);
    }

leetcode——78.子集_第1张图片

 

 位向量法

public List> subsets(int[] nums) {
        Arrays.sort(nums);
        List> 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> result) {
        if(step == nums.length){
            List subset = new ArrayList<>();
            for(int i = 0;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> subsets(int[] nums) {
        List> output = new ArrayList<>();
        int n = nums.length;

        for (int i = 1<i) {
            // generate bitmask, from 0..00 to 1..11
            String bitmask = Integer.toBinaryString(i).substring(1);

            // append subset corresponding to that bitmask
            List curr = new ArrayList<>();
            for (int j = 0; j < n; ++j) {
                if (bitmask.charAt(j) == '1') curr.add(nums[j]);
            }
            output.add(curr);
        }
        return output;
    }

leetcode——78.子集_第2张图片

 

 ——2020.7.30

你可能感兴趣的:(leetcode——78.子集)