題目:
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
題解:
這個在subset題的第一種解法的基礎上有兩種解決辦法。。
1. 在新增res時候判斷是否res中已經存過該item了。沒存過的才存保證子集唯一性。
程式碼如下:
1 public static void dfs(int[] S, int start, int len, ArrayList<Integer> item,ArrayList<ArrayList<Integer>> res){
2 if(item.size()==len){
3 if(!res.contains(item))
4 res.add(new ArrayList<Integer>(item));
5 return;
6 }
7 for(int i=start; i<S.length;i++){
8 item.add(S[i]);
9 dfs(S, i+1, len, item, res);
10 item.remove(item.size()-1);
11 }
12
13 }
14
15 public static ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
16 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>> ();
17 ArrayList<Integer> item = new ArrayList<Integer>();
18 if(S.length==0||S==null)
19 return res;
20
21 Arrays.sort(S);
22 for(int len = 1; len<= S.length; len++)
23 dfs(S,0,len,item,res);
24
25 res.add(new ArrayList<Integer>());
26
27 return res;
28 }
2 if(item.size()==len){
3 if(!res.contains(item))
4 res.add(new ArrayList<Integer>(item));
5 return;
6 }
7 for(int i=start; i<S.length;i++){
8 item.add(S[i]);
9 dfs(S, i+1, len, item, res);
10 item.remove(item.size()-1);
11 }
12
13 }
14
15 public static ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
16 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>> ();
17 ArrayList<Integer> item = new ArrayList<Integer>();
18 if(S.length==0||S==null)
19 return res;
20
21 Arrays.sort(S);
22 for(int len = 1; len<= S.length; len++)
23 dfs(S,0,len,item,res);
24
25 res.add(new ArrayList<Integer>());
26
27 return res;
28 }
2. 還有一種方法就是在DFS過程中 當有重複元素出現就只對當前這個元素走一起,其他重複元素跳過。參考:http://blog.csdn.net/worldwindjp/article/details/23300545
程式碼如下:
1 public static void dfs(int[] S, int start, int len, ArrayList<Integer> item,ArrayList<ArrayList<Integer>> res){
2 if(item.size()==len){
3 res.add(new ArrayList<Integer>(item));
4 return;
5 }
6 for(int i=start; i<S.length;i++){
7 item.add(S[i]);
8 dfs(S, i+1, len, item, res);
9 item.remove(item.size()-1);
10 while(i<S.length-1&&S[i]==S[i+1])//跳過重複元素
11 i++;
12 }
13
14 }
15
16 public static ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
17 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>> ();
18 ArrayList<Integer> item = new ArrayList<Integer>();
19 if(S.length==0||S==null)
20 return res;
21
22 Arrays.sort(S);
23 for(int len = 1; len<= S.length; len++)
24 dfs(S,0,len,item,res);
25
26 res.add(new ArrayList<Integer>());
27
28 return res;
29 }
2 if(item.size()==len){
3 res.add(new ArrayList<Integer>(item));
4 return;
5 }
6 for(int i=start; i<S.length;i++){
7 item.add(S[i]);
8 dfs(S, i+1, len, item, res);
9 item.remove(item.size()-1);
10 while(i<S.length-1&&S[i]==S[i+1])//跳過重複元素
11 i++;
12 }
13
14 }
15
16 public static ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
17 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>> ();
18 ArrayList<Integer> item = new ArrayList<Integer>();
19 if(S.length==0||S==null)
20 return res;
21
22 Arrays.sort(S);
23 for(int len = 1; len<= S.length; len++)
24 dfs(S,0,len,item,res);
25
26 res.add(new ArrayList<Integer>());
27
28 return res;
29 }