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

猜你喜欢

转载自www.cnblogs.com/taoyuxin/p/13402925.html