leetcode 90. 子集 II

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

基本思路:与题目leetcode78子集 差不多,由于Java默认的sort函数是从小到大的,所以在求子集的过程中是从后往前的。每cur每次减一(增加一个新数字)产生的新子集是将新数字添加到从finalRes的第ii到第len个元素的并集。如图

新增加的数字添加到上一部分(框框内)组成下一轮的输出。它有一个范围(即框框内的)下标为[ii,len]。78题则是新添加的数字添加到所有的finalRes元素中。

 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     }
原文地址:https://www.cnblogs.com/yfs123456/p/11574765.html