栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣题78子集

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣题78子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

1.回溯法。

class Solution {
    public List> subsets(int[] nums) {
        List> list = new ArrayList<>();
        List subList = new ArrayList<>();

        subset(nums,list,subList,0);
        return list;
    }

    public void subset(int[] nums,List> list,List subList,int begin){
        list.add(new ArrayList<>(subList));//没有显示递归结束条件,当前遍历到的组合直接加入list

        for(int i = begin;i < nums.length;i++){
            subList.add(nums[i]);
            subset(nums,list,subList,i+1);//加入下一个位置上的数字
            subList.remove(subList.size() - 1);
        }
    }
}

2.一种动态规划的思想来自评论@MonYL:包含当前数的子集组合=上一个数的获得的每一个子集组合+当前数。所有子集=遍历的每一个数的获得的子集组合的合集。

class Solution {
    public List> subsets(int[] nums) {
        List> res=new ArrayList<>();
        List initSub=new ArrayList<>();
        res.add(initSub);//先加入一个空集
        for (int i = 0; i < nums.length; i++) {//遍历数组中的每个数字
            int num=nums[i];
            int time=res.size();//遍历上一个数字后的子列表数量
            for (int j = 0; j < time; j++) {//在每一个之前的子列表中加一个当前遍历到的数字
                List list=res.get(j);
                List sub=new ArrayList<>(list);//创建一个新的子集
                sub.add(num);//加入当前遍历到的数字
                res.add(sub);//将新的子集加入到list中
            }
        }
        return res;
    }
}

题源:力扣

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/511159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号