LintCode 18-带重复元素的子集 JAVA

来源:互联网 发布:java开发单元测试 编辑:程序博客网 时间:2024/04/30 03:36

本人电子系,只为一学生。心喜计算机,小编以怡情。


带重复元素的子集

给定一个可能具有重复数字的列表,返回其所有可能的子集

注意事项
子集中的每个元素都是非降序的
两个子集间的顺序是无关紧要的
解集中不能包含重复子集
样例
如果 S = [1,2,2],一个可能的答案为:

[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]


思路:递归法
自己定义了位置参数currentposition
缺点:递归参数应该可以减少。。吧?


static public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] nums) {        //定义了两个List        ArrayList<Integer> str=new ArrayList<>();        List<ArrayList<Integer>> ret=new ArrayList<>();        //获取数组长度        int n=nums.length;        //添加[],我递归程序不考虑[],因此在这里处理        ret.add(new ArrayList<Integer>());        //考虑特殊情况-空数组        if(nums.length==0) return (ArrayList<ArrayList<Integer>>) ret;        //对数组排序,因为题目要求是升序        Arrays.sort(nums);        //调用递归        //(第一层,共n层,返回ret,临时ArrayList,0号位置开始)        recursion(1,n,ret,str,nums,0);        return (ArrayList<ArrayList<Integer>>) ret;    }    static void recursion(int k,int n,List<ArrayList<Integer>> ret,ArrayList<Integer> str,int nums[],int currentposition)    {        if(k>n)//退出条件            return;        else        {            for(int i=0;i<nums.length;i++)            {                int candidate=nums[i];//取一个候选解                if(i>currentposition||k==1)//满足候选解在后面或者是第一层元素时                {                    str.add(candidate);//临时ArrayList添加候选解                    if(!ret.contains(str))//如果ret不包含                    {                        ret.add(new ArrayList<>(str));//添加,注意这里要new一个新的                    }                    //递归                    recursion(k+1, n, ret, str, nums,i);                    //撤销候选解,进行其他的尝试                    str.remove(str.size()-1);                }            }        }           }
0 0
原创粉丝点击