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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
// @lc code=start
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// Solution1 for循环中遍历中排序,时间复杂度太高
class Solution1 {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> subsets = new ArrayList<>();
for(int k = 0; k<= nums.length; k++){
dfs(nums,0,k,new ArrayList<>(),subsets);
}
return subsets;
}
public void dfs(int[] nums, int begin, int k, List<Integer> cur
, List<List<Integer>> subsets ){
if(k == cur.size()){
//donnot collect dep subset
if(isContainTargeList(subsets, new ArrayList<>(cur))){
return;
}
subsets.add(new ArrayList<>(cur));
return;
}
for(int i =begin; i <nums.length - (k - cur.size()-1); i++){
cur.add(nums[i]);
dfs(nums, i+1, k, cur, subsets);
cur.remove(cur.size()-1);
}
}
public boolean isContainTargeList(List<List<Integer>> subsets, List<Integer> targeList ){
//因为是组合,不考虑元素顺序,所有需要遍历subsets,判断是否是否包含与targeList相同的组合
for(int i = 0; i< subsets.size();i++){
Collections.sort(subsets.get(i));
Collections.sort(targeList);
if(subsets.get(i).equals(targeList)){
return true;
}
}
return false;
}
}
class Solution {
List<List<Integer>> subsets = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
dfs(nums,0);
return subsets;
}
public void dfs(int[] nums, int begin){
subsets.add(new ArrayList<>(path));
for(int i = begin; i< nums.length; i++ ){
//树的同一层,相同元素需要去重,直接跳过
if(i > begin && nums[i] == nums[i-1]){
continue;
}
path.add(nums[i]);
dfs(nums, i+1);
path.removeLast();
}
}
}
// @lc code=end
|