力扣 子集

embedded/2025/1/15 18:30:10/

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

题目

 

求子集中,数组的每种元素有选与不选两种状态。因此在使用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/embedded/154162.html

相关文章

调用Kimi的API接口使用,对话,json化,产品化

背景 Kimi出来一年多了&#xff0c;其输出内容的质量和效果在早期的模型里面来说还是不错的&#xff0c;虽然现在有一些更好的效果的模型和它不分上下&#xff0c;但是kimi的搜索能力&#xff0c;长文本的总结能力&#xff0c;还有其产品化的丰富程度&#xff0c;我觉得是别的…

Springboot和Es整合

说明&#xff1a;本文章主要是简单整合和简单增删改查。 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

PySide6的资源文件(.qrc 文件)简介以及RCC工具

.qrc 文件 .qrc 文件是 Qt 资源系统&#xff08;Qt Resource System&#xff09;的一部分&#xff0c;用于定义应用程序的资源集合。这些资源可以是图像、图标、样式表、音频文件等。 .qrc 文件的格式 .qrc 文件使用 XML 格式编写&#xff0c;下面将详细介绍 .qrc 文件的…

Unocss 中 !important 的使用及相关特性解析

​ 引言 在前端开发中&#xff0c;样式冲突是经常会遇到的问题。Unocss 作为一款强大的原子化 CSS 框架&#xff0c;提供了许多便捷的方式来处理样式&#xff0c;其中 !important 的使用有着独特的规则和场景。本文将深入探讨这些内容&#xff0c;并介绍一些其他有用的 Unocss …

【后端面试总结】tls中.crt和.key的关系

tls中.crt和.key的关系 引言 在现代网络通信中&#xff0c;特别是基于SSL/TLS协议的加密通信中&#xff0c;.crt和.key文件扮演着至关重要的角色。这两个文件分别代表了数字证书和私钥&#xff0c;是确保通信双方身份认证和数据传输安全性的基石。本文旨在深入探讨TLS中.crt和…

打桩机:灾害救援中的 “应急尖兵”,稳固支撑的保障|鼎跃安全

在自然灾害或突发事故中&#xff0c;如地震、泥石流、洪涝灾害、山体滑坡等&#xff0c;地质条件的不稳定可能导致建筑物倒塌、道路损毁、堤坝决口等情况&#xff0c;严重威胁人员和财产安全。 打桩机是一种用于将桩打入地基的重型机械设备&#xff0c;其主要功能是提供支撑力&…

k8s基础(6)—Kubernetes-存储

Kubernetes-存储概述 k8s的持久券简介 Kubernetes的持久卷&#xff08;PersistentVolume, PV&#xff09;和持久卷声明&#xff08;PersistentVolumeClaim, PVC&#xff09;为用户在Kubernetes中使用卷提供了抽象。PV是集群中的一块存储&#xff0c;PVC是对这部分存储的请求。…

单元测试流程

1.如何编写测试 odoo 的后端测试使用的是unittest,只需要在模块文件下增加一个test的目录即可,注意该test目录不需要被模块文件里的_init_.py文件导入,然后就是使用unittest的框架方式写测试用例 2.启动单元测试 首先建立一个新的数据库并且选择加载演示数据(demo data) 然后…