给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
基本思路:与题目leetcode78子集 差不多,区别在于要把
1 /** 2 * 3 * @param nums:从大到小的有序数组 4 * @param n:数组长度 5 * @param cur:当前位置 6 * @param finalRes:最终结果 7 * @param i:finalRes起始位置 8 */ 9 private void result(int[] nums,int n, int cur, List<List<Integer>> finalRes, int i){ 10 if (cur == -1){ 11 return; 12 } 13 int len = finalRes.size()-1; 14 int ii = (nums[cur] != nums[cur+1]) ? 1 : i; 15 // 当前位置也是一个子集, 故添加 16 if (nums[cur] != nums[cur+1]) { 17 List<Integer> elem = new ArrayList<>(); 18 elem.add(nums[cur]); 19 finalRes.add(elem); 20 } 21 for (int j = ii; j <= len; ++j){ 22 List<Integer> e = new ArrayList<>(); 23 e.add(nums[cur]); 24 e.addAll(finalRes.get(j)); 25 finalRes.add(e); 26 } 27 result(nums, n, cur-1, finalRes, len+1); 28 } 29 30 31 public List<List<Integer>> subsetsWithDup(int[] nums) { 32 // 将数组排序 33 Arrays.sort(nums); 34 35 List<List<Integer>> res = new ArrayList<>(); 36 List<Integer> elem1 = new ArrayList<>(); 37 res.add(elem1); 38 39 // 生成最后一个重复数字的子集 40 List<Integer> elem2 = new ArrayList<>(); 41 elem2.add(nums[nums.length-1]); 42 res.add(elem2); 43 int i; 44 for (i = nums.length-2; i >= 0 && nums[i] == nums[i+1]; --i){ 45 List<Integer> e = new ArrayList<>(); 46 e.add(nums[i]); 47 e.addAll(res.get(res.size()-1)); 48 res.add(e); 49 } 50 result(nums, nums.length, i, res, 1); 51 return res; 52 }