【算法】回溯算法专题① ——子集型回溯 python
目录
- 引入
- 变形
- 实战演练
- 总结
引入
子集 https://leetcode.cn/problems/subsets/description/
给你一个整数数组 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 中的所有元素 互不相同
思路1:
对每一个元素可以考虑选或不选
代码如下(法1):
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans = []path = []n = len(nums)def dfs(i):if i == n:ans.append(path.copy()) # 不copy的话,后续path的值发生变化会影响ansreturn# 选path.append(nums[i])dfs(i + 1)path.pop() # 回溯# 不选dfs(i + 1)dfs(0)return ans
思路2:
对答案枚举:
第一个数选谁,第二个数选谁,第三个数选谁,依此类推
通过从小到大确保不重复
code (法2):
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans = []path = []n = len(nums)def dfs(i):ans.append(path.copy())for j in range(i, n): # 枚举选择的数字path.append(nums[j])dfs(j + 1)path.pop() # 回溯dfs(0)return ans
变形
子集 https://leetcode.cn/problems/subsets-ii/
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
思路分析:
与之前相比多了重复元素:
在考虑不选的情况时需要判断是否为重复元素
题解code(法1):
class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:ans = []path = []n = len(nums)nums.sort()def dfs(i):if i == n:ans.append(path.copy())return# 选path.append(nums[i])dfs(i + 1)path.pop()# 不选while i + 1 < n and nums[i + 1] == nums[i]:i += 1dfs(i + 1)dfs(0)return ans
法2 code:
class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:ans = []path = []n = len(nums)nums.sort()def dfs(i):ans.append(path.copy())for j in range(i, n):if j > i and nums[j] == nums[j - 1]:continue# 跳过,枚举下一个path.append(nums[j])dfs(j + 1)path.pop()dfs(0)return ans
实战演练
分割回文串 https://leetcode.cn/problems/palindrome-partitioning/description/
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:
输入:s = “a”
输出:[[“a”]]
提示:
1 <= s.length <= 16
s 仅由小写英文字母组成
思路1:
对每个结束位置考虑选或不选
(可以假设每对相邻字符之间有个逗号,选还是不选)
题解1:
class Solution:def partition(self, s: str) -> List[List[str]]:ans = []path = []n = len(s)def dfs(i, start):# start作为回文子串的开始,i作为子串的结束if i == n:ans.append(path.copy())return# 选(把 s[i] 作为子串的最后一个字符)temp = s[start : i + 1]if temp == temp[::-1]:path.append(temp)dfs(i + 1, i + 1)path.pop()# 不选(最后一个必须选,不然有空字符串)if i < n - 1:dfs(i + 1, start)dfs(0, 0)return ans
思路2:
枚举子串结束位置
题解2:
class Solution:def partition(self, s: str) -> List[List[str]]:ans = []path = []n = len(s)def dfs(i):if i == n:ans.append(path.copy())returnfor j in range(i, n):temp = s[i : j + 1]if temp == temp[::-1]:path.append(temp)dfs(j + 1)path.pop()dfs(0)return ans
总结
回溯算法是一种通过构建所有可能的解决方案,并在发现当前路径无法达到目标时“回退”一步尝试其他可能性的算法技术。
其核心思想是试探性地解决问题,如果发现当前的选择不符合要求,则撤销前面的选择(即回溯),并尝试其它选择。
END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢
相关文章:
【算法】回溯算法专题① ——子集型回溯 python
目录 引入变形实战演练总结 引入 子集 https://leetcode.cn/problems/subsets/description/ 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 …...
Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)
文章目录 Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)settings.gradle.kts 基础配置选项单项目配置多项目配置 高级配置选项插件管理(Plugin Management)基础配置模板案例:Android项目标准配…...
makailio-alias_db模块详解
ALIAS_DB 模块 作者 Daniel-Constantin Mierla micondagmail.com Elena-Ramona Modroiu ramonaasipto.com 编辑 Daniel-Constantin Mierla micondagmail.com 版权 © 2005 Voice Sistem SRL © 2008 asipto.com 目录 管理员指南 概述依赖 2.1 Kamailio 模块 2.2 外…...
【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
一、使用pytorch框架实现逻辑回归 1. 数据部分: 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量,方便后续在模型中…...
Spring Boot - 数据库集成06 - 集成ElasticSearch
Spring boot 集成 ElasticSearch 文章目录 Spring boot 集成 ElasticSearch一:前置工作1:项目搭建和依赖导入2:客户端连接相关构建3:实体类相关注解配置说明 二:客户端client相关操作说明1:检索流程1.1&…...
Java篇之继承
目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…...
32. C 语言 安全函数( _s 尾缀)
本章目录 前言什么是安全函数?安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1:strcpy_s 和 strcat_s示例 2:memcpy_s示例 3:strtok_s 总结 …...
ArkTS编程规范
文章目录 目标和适用范围规则来源章节概览代码风格编程实践 术语和定义总体原则命名类名、枚举名、命名空间名采用UpperCamelCase风格变量名、方法名、参数名采用lowerCamelCase风格常量名、枚举值名采用全部大写,单词间使用下划线隔开避免使用否定的布尔变量名&…...
SQL进阶实战技巧:断点去重技术详解
目录 一、核心概念 二、典型应用场景 三、实现步骤与SQL示例 场景 目标 步骤 分析 结果 四、核心原理解释 1. 核心原理:相邻比较 2. 去重的本质 3. 与传统方法的对比 4 类别理解 五、如何应对复杂场景? 1. 多字段断点检测 2. 时间窗口断点 …...
深度学习之“向量范数和距离度量”
在深度学习中,范数和向量距离是两个不同的概念。向量范数是一种函数,用于将一个实数或复数向量映射为一个值。虽然范数通常用于度量向量之间的距离,但是同样也有其它的一些表示距离的方式。 范数距离 范数是具有“长度”概念的函数。在向量…...
基于Python的简单企业维修管理系统的设计与实现
以下是一个基于Python的简单企业维修管理系统的设计与实现,这里我们会使用Flask作为Web框架,SQLite作为数据库来存储相关信息。 1. 需求分析 企业维修管理系统主要功能包括: 维修工单的创建、查询、更新和删除。设备信息的管理。维修人员…...
javascript常用函数大全
javascript函数一共可分为五类: •常规函数 •数组函数 •日期函数 •数学函数 •字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮。 (2)confirm函数:显…...
【Leetcode 每日一题】81. 搜索旋转排序数组 II
问题背景 已知存在一个按非降序排列的整数数组 n u m s nums nums,数组中的值不必互不相同。 在传递给函数之前, n u m s nums nums 在预先未知的某个下标 k ( 0 < k < n u m s . l e n g t h ) k\ (0 < k < nums.length) k (0<k<…...
< OS 有关 > Android 手机 SSH 客户端 app: connectBot
connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上,连接 SSH 服务器,去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …...
【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解
目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 针对复杂装载问题、及0/1背包问题开展分析、建模、评价,算法设计与优化,并进行编码实践。 理解复杂装载…...
仿真设计|基于51单片机的温湿度、一氧化碳、甲醛检测报警系统
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)温湿度传感器、CO传感器、甲醛传感器实时检测温湿度值、CO值和甲醛值进…...
使用vhd虚拟磁盘安装两个win10系统
使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置,输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字,用于区分8.打开…...
Python学习——函数参数详解
Python中的函数参数传递机制允许多种灵活的参数类型,可以根据需求灵活配置参数,这使得函数具有更强大的扩展性和适应性。以下是对各类参数类型的详细说明: 1. 定义函数的不同参数类型 1.1 位置参数 定义方式:def func(a, b2) 特…...
深入理解Spring事务管理
一、事务基础概念 1.1 什么是事务? 事务(Transaction)是数据库操作的最小工作单元,具有ACID四大特性: 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败 一致…...
自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)
先修复上一次的bug,添加新指令,并增加图形界面 #include <graphics.h> #include <conio.h> #include <windows.h> #include <commdlg.h> #include <iostream> #include <fstream> #include <sstream> #inclu…...
基于最近邻数据进行分类
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt# 生成一个简单的数据集 (2个特征和2个分类…...
ASP.NET Core 启动并提供静态文件
ASP.NET Core 启动并提供静态文件 即是单个可执行文件,它既运行 API 项目,也托管 前端项目(通常是前端的发布文件)。 这种方式一般是通过将 前端项目 的发布文件(例如 HTML、CSS、JavaScript)放入 Web AP…...
【异步编程】CompletableFuture:异步任务的选择(执行最快的)执行
文章目录 一. applyToEither : 拿到第一个任务结束的结果二. runAfterEither :第一个任务完成后执行副作用三. acceptEither:消费第一个任务的结果四. 三种接口总结 对于两个异步任务,我们有时希望在其中一个任务完成时立即执行某些操作&…...
4 [危机13小时追踪一场GitHub投毒事件]
事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...
变量和常量
一.变量 1.标准声明 var 变量名 变量类型 变量声明行末不需要分号 2..批量声明 package main import "fmt" func main(){var(a string b int c boold float32)}3.变量的初始化 var a int 10 var b float321.1 4.类型推导 var name"tom" var age18 fmt.Pr…...
大模型概述(方便不懂技术的人入门)
1 大模型的价值 LLM模型对人类的作用,就是一个百科全书级的助手。有多么地百科全书,则用参数的量来描述, 一般地,大模型的参数越多,则该模型越好。例如,GPT-3有1750亿个参数,GPT-4可能有超过1万…...
流浪 Linux: 外置 USB SSD 安装 ArchLinux
注: ArchLinux 系统为滚动更新, 变化很快, 所以本文中的安装方法可能很快就过时了, 仅供参考. 实际安装时建议去阅读官方文档. 最近, 突然 (也没有那么突然) 有了一大堆 PC: 4 个笔记本, 2 个台式主机 (M-ATX 主板), 1 个小主机 (迷你主机). 嗯, 多到用不过来. 但是, 窝又不能…...
Hot100之子串
560和为K的子数组 题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列 思路解析 ps:我们的presum【0】就是0,如果没有这个0的话我们的第一个元素就无法减去上…...
网络工程师 (11)软件生命周期与开发模型
一、软件生命周期 前言 软件生命周期,也称为软件开发周期或软件开发生命周期,是指从软件项目的启动到软件不再被使用为止的整个期间。这个过程可以细分为多个阶段,每个阶段都有其特定的目标、任务和产出物。 1. 问题定义与需求分析 问题定义…...
(三)QT——信号与槽机制——计数器程序
目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…...
