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 =
If S =
[1,2,2], a solution is:[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
solution1:DFS, recursion
这一题是上面Subset I的延伸,在这一题种,输入集合有重复的元素了,但是要求输出结果不能有重复的Set
例如,假设集合为[2,3,3],如果按照Subset I的程序不做改动,会出现什么情况呢
[]
[2]
[2,3]
[2,3,3]
[2,3] //把最后一个3删去,再把倒数第二个3删去,此时集合剩下[2],此层的循环还没完,还可以取最后一个,3,所以生成了重复的集合[2,3]
[3]
[3,3]
[3] //同理,把最后一个3删去,再把倒数第二个3删去,第一层循环还可以取最后一个数3,所以生成了重复的集合[3]
那么,我们需要做的是,在删去元素后,再取元素的时候,不要取和刚刚取过的元素相等的元素。
public class Solution {
public ArrayList> subsetsWithDup(int[] num) {
ArrayList> res = new ArrayList>();
ArrayList list = new ArrayList();
Arrays.sort(num);
res.add(list);
if(num == null || num.length == 0)
return res;
select(num, 0, res, list);
return res;
}
public void select(int[] num, int pos, ArrayList> res, ArrayList list) {
for(int i = pos; i < num.length; i++) {
list.add(num[i]);
res.add(new ArrayList (list));
select(num, i+1, res, list);
list.remove(list.size() - 1);
while(i < num.length - 1 && num[i+1] == num[i]) //如果和刚取过的元素相等,i++
i++;
}
}
}
solution2:iterator
public class Solution {
public ArrayList> subsetsWithDup(int[] num) {
ArrayList> res = new ArrayList>();
ArrayList list = new ArrayList();
res.add(list);
if(num == null || num.length == 0) {
return res;
}
Arrays.sort(num);
int start = 0;
for(int i = 0; i < num.length; i++) {
int size = res.size();
for(int j = start; j < size; j++) {
list = new ArrayList(res.get(j));
list.add(num[i]);
res.add(list);
}
if(i < num.length - 1 && num[i] == num[i + 1]) { //deal with the duplicate elements
start = size;
}else {
start = 0;
}
}
return res;
}
}
No comments:
Post a Comment