【LeetCode-中等题】78. 子集

文章目录

题目

注意:这里的nums数组里面的元素是各不相同的,所以不存在去重操作

方法一:动态规划


java 复制代码
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>>  res = new ArrayList<>();//结果集
        res.add(new ArrayList<>());// 首先将空集加入解集中
        int n =  nums.length;
        List<Integer> zres = null;
        for(int i = 0 ; i < n ; i++){
            int size = res.size(); // 当前子集数
            for(int j = 0 ; j<size ;j++){
                zres = new ArrayList<>(res.get(j));// 拷贝所有子集
                zres.add(nums[i]);// 向拷贝的子集中加入当前数形成新的子集
                res.add(zres);// 向lists中加入新子集
            }
        }
        return res;
    }

方法二:递归加回溯(关键----startIndex)

参考讲解视频:回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集

根据nums1,2,3 可以画出树图,收获的结果集为所有节点,并且根据startIndex 每次只能取startIndex 后面的数,这样可以避免取到【1,2】 【2,1】这样的集合 这两个集合其实是同一个子集,所以每次递归都让startIndex +1 让递归后的只能取startIndex 后面的数

并且注意回溯(在递归后删除递归前加入的数)

java 复制代码
    List<List<Integer>> res = new ArrayList<>();//结果集
    public List<List<Integer>> subsets(int[] nums) {
       List<Integer> zres  = new ArrayList<>();
        int  startIndax = 0;//每一次取子结果的开始位置,第一次肯定从第一个位置开始
       dfsback(nums,startIndax,zres);
       return res;
    }
    //递归+回溯
    public void  dfsback(int[]nums,int startIndax, List<Integer> zres){
            res.add(new ArrayList<>(zres));//收获结果
            if(startIndax >= nums.length) return ;//这个条件有没有都没关系  因为如果startIndax >= nums.length  那么下面的for循环根本不会执行  自然会return掉
            for(int i = startIndax ; i<nums.length  ;i++){
                zres.add(nums[i]);//收获子结果集
                dfsback(nums,i + 1 ,zres);//往下递归
                zres.remove(zres.size()-1);//回溯,还原状态
            }
    }
相关推荐
皓月斯语6 分钟前
B3867 [GESP202309 三级] 小杨的储蓄 题解
c++·算法·题解
半夢半醒129 分钟前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加菱形、平行四边形、圆角矩形,文本居中显示
算法·c#·流程图
Jerry37 分钟前
LeetCode 90. 子集 II
算法
机器学习之心1 小时前
CCD实验设计+SVM代理建模+改进NSGA-II工艺参数多目标优化,MATLAB代码
算法·支持向量机·matlab·多目标优化
SOLECA_1 小时前
Ascend C 算子实战(二)|SigmoidCustom 逐元素激活算子完整开发指南
算法
Jerry1 小时前
LeetCode 78. 子集
算法
DuHz2 小时前
论文解读:用于数据分析的极值点对称模态分解方法 (Extreme-point Symmetric Mode Decomposition,ESMD)
论文阅读·算法·信息与通信·信号处理
菜小麒2 小时前
面试问题-01
面试·职场和发展
HZZD_HZZD2 小时前
用电负荷聚类分析实战:基于`scikit-learn`的`K-Means`与`DBSCAN`双算法对比、`PCA`降维可视化与智能电表负荷画像全流程
算法·scikit-learn·kmeans
MIngYaaa5202 小时前
2026暑期牛客多校1 2026-7-17
数据结构·算法