Leetcode subsets2

来源:互联网 发布:淘宝网妈妈冬装 编辑:程序博客网 时间:2024/04/30 16:56

第一次提交犯了个常见错误,调用下面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
原创粉丝点击