Leetcode subsets2

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值