题目:
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 }