现在的位置: 首页 > 综合 > 正文

Leetcode subsets2

2018年03月18日 ⁄ 综合 ⁄ 共 1338字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.