leetcode——78.子集
阿新 • • 發佈:2020-07-30
遞迴
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; } privatevoid 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