子集
问题陈述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
**说明:**解集不能包含重复的子集。
示例:
1 2 3 4 5 6 7 8 9 10 11 12
| 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
|
思路实现
回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Solution{ public List<List<Integer>> subSet(int[] nums){ List<List<Integer>> subsets=new ArrayList<>(); List<Integer> curSubset=new ArrayList<>(); for(int size=0;size<nums.length;size++){ backtrack(0,subsets,curSubset,nums); } return subsets; } private void backtrack(int start,List<List<Integer>> subsets,List<Integer> curSubset,int[] nums){ if(curSubset.size()==size){ subsets.add(new ArrayList<>(curSubset)); return; } for (int i = start; i < nums.length; i++) { curSubset.add(nums[i]); backtrack(i + 1, curSubset, subsets, size, nums); curSubset.remove(curSubset.size() - 1); } } }
|
子集Ⅱ
问题陈述
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
1 2 3 4 5 6 7 8 9 10
| 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
|
思路分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); List<List<Integer>> subsets = new ArrayList<>(); List<Integer> tempSubset = new ArrayList<>(); boolean[] hasVisited = new boolean[nums.length]; for (int size = 0; size <= nums.length; size++) { backtracking(0, tempSubset, subsets, hasVisited, size, nums); } return subsets; }
private void backtracking(int start, List<Integer> tempSubset, List<List<Integer>> subsets, boolean[] hasVisited,final int size, final int[] nums) {
if (tempSubset.size() == size) { subsets.add(new ArrayList<>(tempSubset)); return; } for (int i = start; i < nums.length; i++) { if (i != 0 && nums[i] == nums[i - 1] && !hasVisited[i - 1]) { continue; } tempSubset.add(nums[i]); hasVisited[i] = true; backtracking(i + 1, tempSubset, subsets, hasVisited, size, nums); hasVisited[i] = false; tempSubset.remove(tempSubset.size() - 1); } } }
|