LeetCode100之子集(78)--Java

1.问题描述

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

子集(幂集)。

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

        示例1

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

        示例2 

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

        提示

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

        难度等级

                中等

        题目链接

        子集

2.解题思路

        这道题要求所有可能的子集,这道题和求全排列那道题的不同之处在于,全排列那道题(1,2,3)和(2,1,3)是两个不同的排列,而(1,2,3)和(2,1,3)是两个相同的子集,取其中一个就可以了,所以这道题,起始比全排列那道题简单一些。

        同样是使用递归+回溯的方法来解决这道题,不过这时候我们就不需要用一个标识数组来标识某个数是否已经被使用过,我们可以直接通过索引来排除掉重复的子集。每一次递归,都从当前索引的下一个数开始,这样后面的所有子集就不可能出现当前索引及其之前的数,这样就不会出现(1,2,3)和(2,1,3)同时出现的情况。

        有了基本思路之后,我们就可以来实现这个基本思路,首先是定义一个存储最终答案的List集合,接着我们要来分析一下递归回溯函数该如何实现。

        //存储最终答案
        List<List<Integer>> data = new ArrayList<>();

        首先,我们来确定递归的结束条件,因为我们通过索引来实现去重,索引当索引越界的时候,递归就可以结束直接返回了,因为索引越界也就代表了所有的数都已经去完了。

        //当起始索引越界时,返回
        if(startIndex >= nums.length){
            return;
        }

        接着,我们来确定一下递归方法需要传入的参数。我们需要传入存储最终答案的List集合,我们还需要一个辅助List集合来帮我们存储当前子集的情况,同时还要传入题目给的数组,和递归方法的起始索引。

    public void backtrack(List<List<Integer>>data, List<Integer> list,int[] nums,int startIndex){
    .......
}

        从给出的两个示例可以看出,没有元素也是一个子集,所以我们一开始就可以将空集啥也没有存入到答案List中,判断完递归的结束条件之后,我们就可以正式进入递归逻辑了(起始前面的空集存入答案List就已经是递归逻辑的一部分了)。

        //将当前子集存入答案List中
        data.add(new ArrayList<>(list));
        //当辅助list中的元素个数与nums中相等时,返回
        if(startIndex >= nums.length){
            return;
        }

        我们从起始索引的位置开始遍历题目给的数组,将每一个数加入当前的子集中,接着递归调用当前的方法,求包含当前子集的其他子集,这里传入的起始索引是(i+1),也就是当前索引+1,这样就不会取到前面的数和当前刚刚存入子集的数了。求完包含当前子集的其他子集之后,我们要将当前的数从子集中取出来进行回溯,因为包含这个数在当前位置的子集我们已经求完了,可以将它舍弃掉了。

        //从起始索引开始遍历nums数组
        for(int i = startIndex;i < nums.length;i++){
            //将数加入子集中
            list.add(nums[i]);
            //i+1,避免取到前面已经取过的数
            backtrack(data,list,nums,i+1);
            //回溯
            list.remove(list.size()-1);
        }

        递归函数结束之后,我们就可以得到所有的子集了,这时直接将结果返回即可。

        //递归函数
        backtrack(data,new ArrayList<>(),nums,0);
        //返回结果
        return data;

3.代码展示

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        //存储最终答案
        List<List<Integer>> data = new ArrayList<>();
        //递归函数
        backtrack(data,new ArrayList<>(),nums,0);
        //返回结果
        return data;
    }
    public void backtrack(List<List<Integer>>data, List<Integer> list,int[] nums,int startIndex){
        //将当前子集存入答案List中
        data.add(new ArrayList<>(list));
        // 当起始索引越界时,返回
        if(startIndex >= nums.length){
            return;
        }
        //从起始索引开始遍历nums数组
        for(int i = startIndex;i < nums.length;i++){
            //将数加入子集中
            list.add(nums[i]);
            //i+1,避免取到前面已经取过的数
            backtrack(data,list,nums,i+1);
            //回溯
            list.remove(list.size()-1);
        }
    }
}

4.总结

        这道题与第46题的求全排列大同小异,都用到了递归+回溯,这道题是使用了起始索引来实现去重和标识是否已经使用,而全排列那道题不需要去重,通过一个标识数组来标识是否已经使用,都是简单的for循环+回溯即可解决了。这道题今天就啰嗦到这,祝大家刷题愉快,早日上岸!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型概述

文章目录 大语言模型的起源大语言模型的训练方式大语言模型的发展大语言模型的应用场景大语言模型的基础知识LangChain与大语言模型 大语言模型的起源 在人类社会中&#xff0c;我们的交流语言并非单纯由文字构成&#xff0c;语言中富含隐喻、讽刺和象征等复杂的含义&#xff0…

关于数字地DGND和模拟地AGND隔离

文章目录 前言一、1、为什么要进行数字地和模拟地隔离二、隔离元件1.①0Ω电阻&#xff1a;2.②磁珠&#xff1a;3.电容&#xff1a;4.④电感&#xff1a; 三、隔离方法①单点接地②数字地与模拟地分开布线&#xff0c;最后再PCB板上一点接到电源。③电源隔离④、其他隔离方法 …

【Redis】常见面试题

什么是Redis&#xff1f; Redis 和 Memcached 有什么区别&#xff1f; 为什么用 Redis 作为 MySQL 的缓存&#xff1f; 主要是因为Redis具备高性能和高并发两种特性。 高性能&#xff1a;MySQL中数据是从磁盘读取的&#xff0c;而Redis是直接操作内存&#xff0c;速度相当快…

什么是循环神经网络?

一、概念 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类用于处理序列数据的神经网络。与传统的前馈神经网络不同&#xff0c;RNN具有循环连接&#xff0c;可以利用序列数据的时间依赖性。正因如此&#xff0c;RNN在自然语言处理、时间序列预测、语…

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…

19.Word:小马-校园科技文化节❗【36】

目录 题目​ NO1.2.3 NO4.5.6 NO7.8.9 NO10.11.12索引 题目 NO1.2.3 布局→纸张大小→页边距&#xff1a;上下左右插入→封面&#xff1a;镶边→将文档开头的“黑客技术”文本移入到封面的“标题”控件中&#xff0c;删除其他控件 NO4.5.6 标题→原文原文→标题 正文→手…

一文讲解Java中Object类常用的方法

在Java中&#xff0c;经常提到一个词“万物皆对象”&#xff0c;其中的“万物”指的是Java中的所有类&#xff0c;而这些类都是Object类的子类&#xff1b; Object主要提供了11个方法&#xff0c;大致可以分为六类&#xff1a; 对象比较&#xff1a; public native int has…

多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude

多项日常使用测试&#xff0c;带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude 注&#xff1a;因为考虑到绝大部分人的使用&#xff0c;我这里所用的模型均为免费模型。官方可访问的。ChatGPT这里用的是4o Ai对话&#xff0c;编程一直以来都是人们所讨论的话题。Ai的出现…

Linux下学【MySQL】表的必备操作( 配实操图和SQL语句)

绪论​ “Patience is key in life &#xff08;耐心是生活的关键&#xff09;”。本章是MySQL中非常重要且基础的知识----对表的操作。再数据库中表是存储数据的容器&#xff0c;我们通过将数据填写在表中&#xff0c;从而再从表中拿取出来使用&#xff0c;本章主要讲到表的增…

【Java数据结构】了解排序相关算法

基数排序 基数排序是桶排序的扩展&#xff0c;本质是将整数按位切割成不同的数字&#xff0c;然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。 先对数组中每个数的个位比大小排序然后按照队列先进先出的顺序分别拿出数据再将拿出的数据分别对十位百位千位…

【全栈】SprintBoot+vue3迷你商城(9)

【全栈】SprintBootvue3迷你商城&#xff08;9&#xff09; 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 后端部分&#xff1a; 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全栈】Spr…

php-phar打包避坑指南2025

有很多php脚本工具都是打包成phar形式&#xff0c;使用起来就很方便&#xff0c;那么如何自己做一个呢&#xff1f;也找了很多文档&#xff0c;也遇到很多坑&#xff0c;这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件&#xff0c;很方便 可通过phar help查看…

【数据结构】_顺序表

目录 1. 概念与结构 1.1 静态顺序表 1.2 动态顺序表 2. 动态顺序表实现 2.1 SeqList.h 2.2 SeqList.c 2.3 Test_SeqList.c 3. 顺序表性能分析 线性表是n个具有相同特性的数据元素的有限序列。 常见的线性表有&#xff1a;顺序表、链表、栈、队列、字符串等&#xff1b…

OPencv3.4.1安装及配置教程

来到GitHub上opencv的项目地址 https://github.com/opencv/opencv/releases/tag/3.4.1 以上资源包都是 OpenCV 3.4.1 版本相关资源&#xff0c;它们的区别如下&#xff1a; (1). opencv-3.4.1-android-sdk.zip&#xff1a;适用于 Android 平台的软件开发工具包&#xff08;SDK…

世上本没有路,只有“场”et“Bravo”

楔子&#xff1a;电气本科“工程电磁场”电气研究生课程“高等电磁场分析”和“电磁兼容”自学”天线“、“通信原理”、“射频电路”、“微波理论”等课程 文章目录 前言零、学习历程一、Maxwells equations1.James Clerk Maxwell2.自由空间中传播的电磁波3.边界条件和有限时域…

ZYNQ-IP-AXI-GPIO

AXI GPIO 可以将 PS 端的一个 AXI 4-Lite 接口转化为 GPIO 接口&#xff0c;并且可以被配置为单端口或双端口&#xff0c;每个通道的位宽可以独立配置。 通过使能三态门可以将端口动态地配置为输入或输出。 AXIGPIO 是 ZYNQ PL 端的一个 IP 核&#xff0c;可以将 AXI-Lite Mas…

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完&#xff0c;确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…

为什么应用程序是特定于操作系统的?[计算机原理]

你把WINDOWS程序复制到MAC上使用&#xff0c;会发现无法运行。你可能会说&#xff0c;MAC是arm处理器&#xff0c;而WINDWOS是X86 处理器。但是在2019年&#xff0c;那时候MAC电脑还全是Intel处理器&#xff0c;在同样的X86芯片上&#xff0c;运行MAC和WINDOWS 程序还是无法互相…

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的开发模式&#xff0c;但是也具有其特色的侦听函数&#xff0c;那么当LigerUI作为View层的时候&#xff0c;他所发送后端的必然是表单的数据&#xff0c;在此我们以俩个div为例&#xff1a; {Layout "~/View…

BurpSuite--暴力破解

一.弱口令 1. 基本概念 介绍&#xff1a;弱口令&#xff08;weak password&#xff09;是指那些容易被他人猜测或通过工具破解的密码。虽然弱口令没有严格的定义&#xff0c;但通常它指的是由简单的数字、字母、常用词语或规律性组合构成的密码。 特点&#xff1a; 密码容易被…