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
31
32
|
public static List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums); // 排序让相同元素聚在一起
f(nums, 0, new int[nums.length], 0, ans);
return ans;
}
public static void f(int[] nums, int i, int[] path, int size, List<List<Integer>> ans) {
if (i == nums.length) {
// 到达边界,收集当前路径
ArrayList<Integer> cur = new ArrayList<>();
for (int j = 0; j < size; j++) {
cur.add(path[j]);
}
ans.add(cur);
} else {
// 找到下一组不同元素的起始位置
int j = i + 1;
while (j < nums.length && nums[i] == nums[j]) {
j++;
}
// 决策1: 当前这组数,一个都不要
f(nums, j, path, size, ans);
// 决策2: 当前这组数,要1个、2个、3个...
for (; i < j; i++) {
path[size++] = nums[i];
f(nums, j, path, size, ans);
}
}
}
|