回溯——7.子集II

news/2024/9/16 12:44:27/ 标签: 算法

力扣题目链接

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

  • 输入: [1,2,2]
  • 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]

解题思路总结:

  1. 排序:首先对数组进行排序,便于之后的重复元素跳过处理。
  2. 回溯法:通过递归遍历所有可能的子集,并在每次递归中将当前路径加入结果集。
  3. 去重:利用排序后的数组,结合 used 数组,通过条件 nums[i] == nums[i-1]not used[i - 1],来跳过同一层中重复的元素,从而避免生成重复子集。

完整代码如下:

class Solution:def subsetsWithDup(self, nums):result = []path = []used = [False] * len(nums)nums.sort()  # 去重需要排序self.backtracking(nums, 0, used, path, result)return resultdef backtracking(self, nums, startIndex, used, path, result):result.append(path[:])  # 收集子集for i in range(startIndex, len(nums)):# used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过# used[i - 1] == False,说明同一树层 nums[i - 1] 使用过# 而我们要对同一树层使用过的元素进行跳过if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:continuepath.append(nums[i])used[i] = Trueself.backtracking(nums, i + 1, used, path, result)used[i] = Falsepath.pop()
def subsetsWithDup(self, nums):result = []path = []used = [False] * len(nums)nums.sort()  # 去重需要排序self.backtracking(nums, 0, used, path, result)return result
  • result:用于存储所有不重复的子集。
  • path:用于存储当前正在构建的子集。
  • used:这是一个布尔数组,用来标记数组中的每个元素是否已经在当前路径(path)中使用过。
  • nums.sort():在处理重复元素时,排序是必须的,因为只有在数组有序的情况下,才能通过简单的条件判断去除重复子集。
def backtracking(self, nums, startIndex, used, path, result):result.append(path[:])  # 收集子集
  • backtracking 函数是回溯算法的核心。
  • startIndex:控制下一步递归从哪里开始选择元素。
  • 每次递归时,当前的 path(表示当前正在构建的子集)会被复制并加入到 result 中,表示我们收集了一个子集。
for i in range(startIndex, len(nums)):# used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过# used[i - 1] == False,说明同一树层 nums[i - 1] 使用过# 而我们要对同一树层使用过的元素进行跳过if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:continue
  • 这里的 for 循环遍历数组的每一个元素,从 startIndex 开始。
  • if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:这个条件判断用于跳过重复的元素,以避免生成重复的子集。具体解释如下:
    • i > 0:确保访问 nums[i-1] 时不会越界。
    • nums[i] == nums[i - 1]:如果当前元素和前一个元素相同,则可能会生成重复子集。
    • not used[i - 1]:前一个元素如果在同一层中没有被使用过(即没有在当前路径中被选择),则说明我们在当前层次中遇到了重复元素,此时应该跳过,以防止生成重复子集。
    path.append(nums[i])used[i] = Trueself.backtracking(nums, i + 1, used, path, result)used[i] = Falsepath.pop()
  • path.append(nums[i]):将当前元素加入到当前路径中。
  • used[i] = True:标记当前元素已经在当前路径中使用。
  • self.backtracking(nums, i + 1, used, path, result):递归调用,开始从下一个索引 i + 1 继续构造子集。
  • used[i] = False:回溯后,将当前元素标记为未使用,以便在其他路径中使用。
  • path.pop():回溯的关键步骤,撤销之前的选择,恢复状态,以便继续构造其他子集。

http://www.ppmy.cn/news/1521757.html

相关文章

AIStarter改进计划:功能优化与内测预告【欢迎吐槽】

随着技术的不断进步,AIStarter也在持续进化,以更好地满足用户的需求。本文将探讨AIStarter的改进计划,包括应用版本号、市场排序、描述和筛选功能的优化,并预告即将到来的内测消息。此外,还将介绍AIStarter在网络加速、…

东南大学研究生-数值分析上机题(2023)Python 3 线性代数方程组数值解法

列主元Gauss消去法 3.1 题目 对于某电路的分析,归结为就求解线性方程组 R I V \pmb{RIV} RIV,其中 R [ 31 − 13 0 0 0 − 10 0 0 0 − 13 35 − 9 0 − 11 0 0 0 0 0 − 9 31 − 10 0 0 0 0 0 0 0 − 10 79 − 30 0 0 0 − 9 0 0 0 − 30 57 − 7 …

【2024-2025源码+文档+调试讲解】微信小程序的城市公交查询系统

摘 要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统城市公交查询管理采取了人工的管理方法…

怎么摆脱非自然链接?

什么是非自然链接? 非自然链接是人为创建的链接,用于操纵网站在搜索引擎中的排名。非自然链接违反了Google 的准则,网站可能会因此受到惩罚。 它们不是由网站所有者编辑放置或担保的。示例包括带有过度优化锚文本的链接、通过 PR 的广告、嵌…

Nginx部署前端VUE项目

要部署一个Vue项目,可以使用nginx作为web服务器。下面是一些步骤: 确保你已经在本地机器上安装了nginx。如果没有安装,请按照官方文档进行安装。 将Vue项目构建为静态文件。在项目根目录下运行以下命令: npm run build这将在项…

如何在Excel中创建一个VBA宏,并设置一个按钮来执行这个宏

下面是一个详细的步骤指南 步骤1:创建VBA宏 1. 打开Excel并按 Alt F11 打开VBA编辑器。 2. 在VBA编辑器中,选择 Insert > Module 来插入一个新的模块。 3. 将以下代码粘贴到模块中: vba Sub CreateNewSheet() 声明一个工作表对象Dim …

【STM32项目设计】STM32F411健康助手--MPU6050陀螺仪驱动(6)

硬件设计 软件设计 此项目使用的是软件I2C,MPU6050的SCL连接到STM32的PB10,SDA连接到STM32的PB9 mpuiic.c #include "mpuiic.h" #include "delay.h"//MPU IIC 延时函数 void MPU_IIC_Delay(void) {delay_us(2); }//初始化IIC voi…

AWS账号关闭后的影响:您需要知道的一切

亚马逊网络服务(AWS)作为全球领先的云计算平台,为众多企业和个人提供了便捷、高效的云服务。然而,当用户决定关闭其AWS账号时,可能会对其现有的服务和资源产生重大影响。我们九河云将通过本文将深入探讨AWS账号关闭后的…

SQLite 创建表:一场数据库里的“造物运动”

嘿,各位数据库的“造物主”们!今天咱们来聊聊SQLite里的一场有趣活动——创建表。没错,就像上帝创造了世界,我们也可以在SQLite数据库里创造属于我们自己的“小世界”。 一、创建表的“魔法咒语” 在SQLite这个“魔法世界”里&a…

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟(振晶) 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…

利用KMeans重新计算自己数据集的anchor

在YOLOv5或YOLOv7中,anchors(锚框)是预设的一组不同大小、不同长宽比的边界框,它们用于在图像中的每个网格单元上进行偏移和缩放,以生成目标的候选框。这些anchors的设定对于提高目标检测的效率和准确性至关重要。 并…

ArcGIS中怎么合并多个点图层并删除重复点?

最近,我接到了一个怎么合并多个点图层并删除其中的重复点的咨询。 下面是我对这个问题的解决思路: 1、合并图层 在地理处理工具里面 选择合并 并设置好要合并的图层即可 2、接下来在 数据管理工具→常规→删除相同项 即可 希望这些建议能对大家有所帮…

docker国内镜像仓库地址

1.vi /etc/docker/daemon.json 2.配置文件内容修改为: { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", &…

Gartner报告解读:如何帮助企业完善数据分析与治理路线图

Gartner服务于全球100多个国家和地区的14,000余家机构,是一家深受客户信赖、观点客观的研究顾问公司。Garnter洞察、建议和工具可帮助您发现创新机遇,完成关键优先任务,助您成为企业不可或缺的战略专家和价值创造者。该公司是标普 500 指数成…

一个好的云渲染,需要具备哪些条件?

​现在云渲染很多设计师和公司都在用,他不仅可以减少设计师和公司的硬件投入,还能提高工作效率,缩短项目周期。一个好的云渲染平台应当具备以下几个关键条件,以确保高效、稳定、灵活且成本效益高的渲染服务: 一、强大…

使用isolation: isolate声明隔离混合模式

在CSS中,isolation 属性与混合模式(如 mix-blend-mode 和 background-blend-mode)并不直接相关,但它确实可以影响元素如何与其他元素进行渲染,尤其是在涉及到堆叠上下文(stacking contexts)和复…

代码随想录 刷题记录-24 图论 (1)理论基础 、深搜与广搜

一、理论基础 参考: 图论理论基础 深度优先搜索理论基础 广度优先搜索理论基础 dfs dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 有递归的地方就有回溯,例如如下代码: void dfs(参数) {…

828华为云征文|采用华为云Flexus云服务器X实例部署YOLOv3算法完成目标检测

文章目录 一、前言1.1 开发需求1.2 Flexus云服务器介绍1.3 YOLOv3目标检测算法1.4 客户端开发思路1.5 客户端运行效果 二、服务器选购2.1 登录官网2.2 选购服务器2.3 选择服务器区域2.4 选择服务器规格2.5 选择系统镜像2.6 选择存储盘2.7 配置密码2.8 配置云备份2.9 确认配置2.…

【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十二)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

【Kafka】怎么解决Kafka消费者消费堆积问题?

文章目录 一、引言二、Kafka消费堆积原因分析三、解决方案1. 重制消费点位2. 增加消费者数量3. 优化消费能力 四、重制消费点位五、增加消费者数量六、优化消费能力七、总结八、参考文献九、附录 摘要:在分布式系统中,Kafka作为消息队列中间件&#xff0…