题目:
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],
[]
]
题意:
给定一个可能包含重复项的整数集合S,返回所有可能的子集。
注意:
子集中的元素必须按非降序排列。
解决方案集不能包含重复的子集。
解题思路:
和 subsets 差不多,都可以用回溯法解决。这里主要和1不同的是,这些有重复项的整数,如当处理第一个2的时候,产生【】,【1】,【1,2】,【2】 。这是到第二个2的时候,在【】,【1】 后面加2的时候会产生重复 。所以只能在上一个循环生成的后两个子集合后面加2。因此我们就写一个判断语句 i > start &&当前数字和前一个数字相同的时候 。如果是就跳过这个数字。
i>start && num[i] == num[i-1] 这里位置不能放反,否则当 i=0时,会抛出数组越界
代码:
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
Arrays.sort(num);
ArrayList<Integer> temp = new ArrayList<Integer>();
backTracking(num,temp,0);
return list;
}
public void backTracking(int[] num, ArrayList<Integer> temp, int start) {
if(num.length < 0) {
return;
}
list.add(new ArrayList<Integer>(temp));
for(int i = start; i < num.length; i++) {
if(i > start && (num[i] == num[i-1])) {
//System.out.println(" continue before"+temp+" start is "+start +" i = "+i);
continue;
}
temp.add(num[i]);
//System.out.println("before"+temp+" start is "+start +" i = "+i);
backTracking(num,temp,i+1);
temp.remove(temp.size()-1);
//System.out.println("after"+temp+" start is "+start +" i = "+i);
}
}
这里并不需要像1那样重写一个排序了。