子集 II(力扣第91题)
题目:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
分析:
需要注意的就是给定的数组中存在重复的元素,然后要求找出的所有子集都是唯一的,不能含有重复的子集。由于数组中可能存在重复的元素,所以可能会造成求出的子集重复,因为集合是无序的,只要含有的元素相同那就是相同的集合,所以为了达到去重的目的,先对给定的数组nums进行一个排序,然后再进行搜索,这就保证了值小的元素不会出现在值大的元素的搜索路径的后面,避免了无序可能造成的子集重复。
实现代码如下:
public List<List<Integer>> subsetsWithDup(int[] nums) { if(nums.length == 0 || nums == null){ return new ArrayList<>(); } resList = new ArrayList<>(); resList.add(new ArrayList<>()); Arrays.sort(nums); List<Integer> curlist = new ArrayList<>(); findsubsets(curlist,0,nums); return resList; } int lastnum = Integer.MIN_VALUE; private void findsubsets(List<Integer> curlist,int s,int[] nums){ if (curlist.size() == nums.length){ return; } for (int i = s; i < nums.length; i++) { if (nums[i] != lastnum){ curlist.add(nums[i]); resList.add(new ArrayList<>(curlist)); findsubsets(curlist,i+1,nums); lastnum = curlist.get(curlist.size()-1); curlist.remove(curlist.size()-1); } } }