力扣 子集

server/2025/1/15 4:59:13/

回溯基础,一题多解,不同的回朔过程。

题目

 

求子集中,数组的每种元素有选与不选两种状态。因此在使用dfs与回溯时把每一个元素分别进行选与不选的情况考虑即可。可以先用dfs跳过当前元素即不选然后一直深层挖下去,直到挖到最深了即等于数组长度了,由于一直没有选,则先返回一个空集。接着,进行回到上一步即回溯过程,回到上一步dfs时则会继续执行下面的语句,直到完成当前的方法再继续回溯上一步的操作。在这一题就可以在回溯过程中加入选取当前元素的操作,接着再加一层dfs目的是为了加入元素后继续选。如数组[1,2,3],这个方法返回的顺序为[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]],因为是回朔过程中把数加进去的,然后也是由于下一步的dfs才使得子集中能够逐步加入。

一定要注意的是,加入结果集时要实例化一个新的副本path,然后再进行remove把原来add的进行恢复,这样的目的就是为了维护好原来的path,然后找到一种可能的结果就添加副本进去,接着恢复,继续用path进行构建所需子集,去找到符合结果,然后加入到ans中。

java">class Solution {private final List<List<Integer>> ans = new ArrayList<>();private final List<Integer> path = new ArrayList<>();private int[] nums;public List<List<Integer>> subsets(int[] nums) {this.nums = nums;dfs(0);return ans;}private void dfs(int i) {if (i == nums.length) { // 子集构造完毕ans.add(new ArrayList<>(path)); // 复制 pathreturn;}// 不选 nums[i]dfs(i + 1);// 选 nums[i]path.add(nums[i]);dfs(i + 1);path.remove(path.size() - 1); // 恢复现场}
}

然后,也可以直接用循环遍历每一个元素,用dfs把可能有的数加进去。在递归的每一层,选择当前元素并继续递归。然后在递归返回时,移除已选择的元素,恢复上一步状态,进入循环准备选择下一个元素,判断下一个元素是否可以加进。当一直回到初始时,又接着原来的循环枚举下一个元素,进一步递归回溯。这个方法返回的顺序为[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]],由循环与递归回溯的顺序可理解到。

java">class Solution {private final List<List<Integer>> ans = new ArrayList<>();private final List<Integer> path = new ArrayList<>();private int[] nums;public List<List<Integer>> subsets(int[] nums) {this.nums = nums;dfs(0);return ans;}private void dfs(int i) {ans.add(new ArrayList<>(path)); // 复制 pathfor (int j = i; j < nums.length; j++) { // 枚举选择的数字path.add(nums[j]);dfs(j + 1);path.remove(path.size() - 1); // 恢复现场}}
}

回溯的题会有一点绕,多练多理解。 


http://www.ppmy.cn/server/158466.html

相关文章

linux新磁盘做分区(GPT分区表)

1、输入lsblk 查看你的新磁盘 2、通过gdisk选择你的分区&#xff0c; 3、设置你的分区类型 o&#xff1a;代表删除你的分区&#xff0c;创建新的保护性主引导记录 (MBR) n&#xff1a;新建分区模式 1&#xff1a;分区号码 默认回车 选择磁盘大小 100G或10T这样 默认回车 w:进行…

自动生成数据:SQLark 让数据测试更高效

在新版本的业务系统开发过程中&#xff0c;需要生成大量的测试数据来模拟真实的业务场景&#xff0c;测试系统的稳定性和性能。今天分享一下我使用SQLark生成测试数据的经验&#xff0c;它能够提供8大类47个子类的数据规则&#xff0c;快速构建仿真测试数据环境&#xff0c;还支…

【Vue + Antv X6】可拖拽流程图组件

使用事项&#xff1a; ❗先放个组件上来&#xff0c;使用手册有空会补全 ❗需要下载依赖 “antv/x6”: “^2.18.1”, “antv/x6-plugin-dnd”: “^2.1.1”, 组件&#xff1a; 组件使用&#xff1a; <flowChart :key"flowChartKey" ref"flowChart" lef…

计算机网络 (39)TCP的运输连接管理

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制&#xff0c;其过程如下&…

JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色

设置输出文件的列宽&#xff0c;防止文件过于丑陋 Sheet sheet workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 25…

NLP中的问答(Question answering)

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;问答&#xff08;Question Answering, QA&#xff09;任务并不严格等同于分类任务&#xff0c;但某些形式的QA任务可以被建模为分类问题。具体情况如下&#xff1a; 1. 问答任务的分类情况 多选问答 如果问题有多个备…

【数据分析】一、初探 Numpy

目录 前言1. 一维 array 的生成2. 一维 array 的基本操作2.1. 查看属性2.2. 花式索引2.3. 条件筛查2.4. 数据统计 3. n 维 array 的生成4. n 维 array 的基本操作4.1. 查看属性4.2. 查询和切片4.3. 花式索引4.4. 矩阵 前言 Numpy是Python的常用开源数值计算扩展库&#xff0c;用…

51单片机 和 STM32 在硬件操作上的差异

51单片机 和 STM32 在硬件操作上的差异 1. 时钟系统的差异 STM32 的时钟系统 STM32 的时钟系统非常复杂&#xff0c;支持多种时钟源&#xff08;如内部晶振、外部晶振、PLL 等&#xff09;&#xff0c;并且每个外设&#xff08;如 GPIO、定时器、串口等&#xff09;都有独立的…