第一次提交犯了个常见错误,调用下面for循环的时候,在for里面修改了subsets,这样子会抛异常。以后得注意,遍历一个collection时候,在遍历里面改变这个collection的长度(增加,删除节点)时要谨慎。如果调用iteractor来for会抛异常,但是普通的计数比如for(int i=0;i<subsets.size();i++){ subsets.add(sth);}则可以编译运行,只是当逻辑不对时,会产生死循环而已。
for(List<Integer> subset : subsets)
{
/*other codes*/
subsets.add(sth);
}
import java.util.*;
public class Solution {
public List<List<Integer>> subsetsWithDup(int[] num) {
Arrays.sort(num);
List<List<Integer>> subsets = new LinkedList<List<Integer>>();
int[] dup = new int[]{0};
subsetsWithDup(num, 0, dup, subsets);
return subsets;
}
public void subsetsWithDup(int[] num, int k,int[] dup, List<List<Integer>> subsets){
if(k >= num.length)
{
List<Integer> subset = new LinkedList<Integer>();
subsets.add(subset);
return;
}
subsetsWithDup(num,k+1,dup, subsets);
if(k<num.length-1 && num[k] == num[k+1])
dup[0]++;
else
dup[0] = 0;
List<List<Integer>> newsubsets = new LinkedList<List<Integer>>();
for(List<Integer> subset : subsets){
int subdup = 0;
while(subdup < subset.size() && subset.get(subdup) == num[k])
subdup++;
if(subdup < dup[0])
continue;
List<Integer> newsub = new LinkedList<Integer>(subset);
newsub.add(0, num[k]);
newsubsets.add(newsub);
}
subsets.addAll(newsubsets);
}
public static void main(String[] args){
Solution sol = new Solution();
int[] num = new int[]{1,2,2};
List<List<Integer>> subsets = sol.subsetsWithDup(num);
for(List<Integer> subset : subsets)
{
for(Integer val : subset)
System.out.print(val + " ");
System.out.println();
}
}
}