LintCode 17-子集 JAVA

本文介绍了一种使用递归方法求解给定整数集合的所有子集问题,并通过具体示例展示了如何确保子集元素按非降序排列且解集中不含重复子集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


子集

给定一个含不同整数的集合,返回其所有的子集
注意事项
子集中的元素排列必须是非降序的,解集必须不包含重复的子集
样例
如果 S = [1,2,3],有如下的解:

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

代码与我另外一篇文章相同LintCode 18-带重复元素的子集 JAVA
原因是:我采用的递归的求解方法是相同的,即先根遍历
比如[1,2,3]
我的解分别是[1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]

static public ArrayList<ArrayList<Integer>> subsets(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);
                }
            }
        }       
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值