第一次提交犯了个常见错误,调用下面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(); } } }