NC27 集合的所有子集

题目描述

现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
你给出的子集中的元素必须按升序排列
给出的解集中不能出现重复的元素
示例:
输入:[1,2,3]
输出:[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
原题链接:集合的所有子集

思路

  • 递归:设两个ArrayList存储结果,arr存储每个子集,res存储所有的子集。递归的思路也比较简单,设置一个记录当前步数的变量k,确定当前循环开始的位置,每次递归都要记录当前的子集。
  • 每一步:记录当前子集,循环递归和回溯。
  • 出口:步数k与数组S的长度相等的时候。

代码

public static ArrayList<ArrayList<Integer>> res;
    public static ArrayList<Integer> arr;
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        arr=new ArrayList<>();
        res=new ArrayList<>();
        res.add(arr);//根据示例,需要添加空集
        f(0,S);
        return res;
    }
    private void f(int k,int[] S){
        if(k==S.length){
            return;
        }
        for(int i=k;i<S.length;i++){
            arr.add(S[i]);//添加新元素进子集
            res.add(new ArrayList<>(arr));//添加新的子集到结果
            f(i+1,S);//进行当前位置的下一步递归
            //注意这里是不重复子集,区分i+1和k+1
            arr.remove(arr.size()-1);
            //去掉当前元素
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值