1. 程式人生 > 實用技巧 >leetcode——78.子集

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