当前位置: 首页 > news >正文

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循环+回溯即可解决了。这道题今天就啰嗦到这,祝大家刷题愉快,早日上岸!

相关文章:

LeetCode100之子集(78)--Java

1.问题描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例1 输入&#xff1a;nums [1,2,3]输出&#xff1a;[[],[1],[2],[1,2],[3],[1…...

React第二十五章(受控组件/非受控组件)

React 受控组件理解和应用 React 受控组件 受控组件一般是指表单元素&#xff0c;表单的数据由React的 State 管理&#xff0c;更新数据时&#xff0c;需要手动调用setState()方法&#xff0c;更新数据。因为React没有类似于Vue的v-model&#xff0c;所以需要自己实现绑定事件…...

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent

作者&#xff1a;来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴&#xff0c;我们很…...

嵌入式知识点总结 Linux驱动 (三)-文件系统

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.什么是文件系统&#xff1f; 2.根文件系统为什么这么重要&#xff1f;​编辑 3.可执行映像文件通常由几部分构成&#xff0c;他们有什么特点&#xff1f; 1.什么是文件系统&a…...

【知识】可视化理解git中的cherry-pick、merge、rebase

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这三个确实非常像&#xff0c;以至于对于初学者来说比较难理解。 总结对比 先给出对比&#xff1a; 特性git mergegit rebasegit cherry-pick功能合并…...

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像

一、背景 由于国际镜像国内无法直接访问&#xff0c;会导致搜索模型时加载失败&#xff0c;如下&#xff1a; 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意&#xff1a;务…...

新站如何快速获得搜索引擎收录?

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/8.html 新站想要快速获得搜索引擎收录&#xff0c;需要采取一系列有针对性的策略。以下是一些具体的建议&#xff1a; 一、网站内容优化 高质量原创内容&#xff1a; 确保网站内容原创、…...

如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 一、Tushare 介绍 Tushare 是一个提供中国股市数据的API接口服务&#xff0c;它允许用户…...

解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题

一般服务器会通过镜像分身或者容器的方式&#xff0c;一个ip分出多个端口给多人使用&#xff0c;但如果碰到需要连接同一user&#xff0c;同一个ip,不同端口的情况&#xff0c;vscode就无法识别&#xff0c;如下图所示&#xff0c;vscode无法区分该ip下不同端口的连接&#xff…...

Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接

介绍 通常用于将文档中的文本数据拆分成易于索引的词项&#xff08;tokens&#xff09;。有时&#xff0c;默认的分词器无法满足特定应用需求&#xff0c;这时就可以创建 自定义分词器 来实现定制化的文本分析。 自定义分词器组成 Char Filters&#xff08;字符过滤器&#x…...

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…...

RocketMQ消息是如何存储的?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ消息是如何存储的&#xff1f;】面试题。希望对大家有帮助&#xff1b; RocketMQ消息是如何存储的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...

Ubuntu 16.04安装Lua

个人博客地址&#xff1a;Ubuntu 16.04安装Lua | 一张假钞的真实世界 在Linux系统上使用以下命令编译安装Lua&#xff1a; curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz tar zxf lua-5.3.3.tar.gz cd lua-5.3.3 make linux test 安装make 编译过程如果提示以下信息…...

【JavaSE】String类常用字符串方法总结

目录 1. length() 求字符串长度 2. isEmpty() 判断字符串是否为空 3. String对象的比较 3.1 equals() 判断字符串是否相同 3.2 compareTo() 比较字符串大小 3.3 compareToIgnoreCase 忽略大小写比较 4. 字符串查找 4.1 charAt() 返回指定索引处的字符 4.2 indexOf() 4…...

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型&#xff0c;以便根据输入特征预测目标变量&#xff0c;在使用 TensorFlow 2.x 实现线性回归模型时&…...

机器人抓取与操作概述(深蓝)——1

工业机器人&#xff1a;① “臂”的形态 ② “手”的形态 ③ 视觉&#xff0c;力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作&#xff1a;插入、推和滑 抓取&#xff1a;两指&#xff08;平行夹爪&#xff09;抓取、灵巧手抓取 落地-产…...

简单聊聊“DeepSeek”

目录 DeepSeek一夜火爆并受到广泛关注的优势 技术实力与创新 低成本与高效率 开源与免费 市场策略与应用领域 团队与资金优势 行业认可与媒体关注 DeepSeek在推理效率上的特别之处 多头潜在注意力&#xff08;MLA&#xff09; 多词元预测&#xff08;MTP&#xff09;…...

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天&#xff0c;为站点或应用部署 HTTPS 已经成为一种常态。然而&#xff0c;手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例&#xff0c;基于 Docker 容器来搭建一个…...

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#xff1a;如果只是贪心的话&#xff0c;容易被局部最大解锁定 方法有&#xff1a;盲目搜索&#xff0c;启发式搜索 盲目搜索&#xff1a;枚举法和蒙特卡洛模拟&#xff0c;但是样例太多花费巨量时间 所以启发式算法就来了&#xff0c;通过经验和规…...

【C语言】结构体与共用体深入解析

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;和共用体&#xff08;union&#xff09;都是用来存储不同类型数据的复合数据类型&#xff0c;它们在程序设计中具有重要的作用。 推荐阅读&#xff1a;操作符详细解说&#xff0c;让你的编程技能更上一层楼 1. 结构体…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...