首页 > 技术文章 > Subset II leetcode java

springfor 2014-07-31 08:09 原文

题目

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. 还有一种方法就是在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     }       

推荐阅读