代码随想录算法训练营第三十天(回溯算法篇)|491. 非递减子序列, 46. 全排列,47. 全排列Ⅱ

491. 非递减子序列

题目链接:491. 非递减子序列 - 力扣(LeetCode)

思路

1. 判断是否将当前遍历到的元素添加到path中。

如果当前元素大于等于前一个元素,满足条件,但前提是当前的i>0,可若加上i>0,那么第一个元素就无法被加入,如果一开始就将其加入,之后又无法pop掉。于是想到比较当前path末尾和遍历到的数nums[i], 如果path存在且其末尾数大于nums[i],就continue到后一个数再比较。那么不满足这个if条件的数就可以加到path中。

2. 如何去重。

之前是通过将nums排序后,根据当前遍历到的元素和前一个是否相同以及startIdx来去重,但无法应用到此题。这里要在for循环外面建一个set来记录当前层用过的元素,如果遍历到的元素出现在set里,就continue到下一个。

然后我又双叒陷入到回溯的漩涡当中了......我当时认为每一次在backtracking中call自己时,这个set都会被重置为空,那它是如何记录的......但事实是,每个递归层次的set是各自维护的,在运行逻辑上,会在下一层开启新的set,但当回溯时,还是能回到当前的set中的。

每一个for循环执行结束,相当于树的一层结束,每次开启新的一轮for循环时,深度就会加一,对当前的深度来说,set重开,记录当前层用过的元素。

我总是试图根据代码的逻辑一步步顺下去检验,但实在有点折磨,反而更容易被绕进去。最好直接从大框架上理解,因为回溯的每一步都是这个大框架下类似的操作。对于set来说,不要想着回溯,只看一层for循环的操作:我们要记录每一层用过的元素,所以只要它在整个for循环外被建立,每次遍历到一个元素,检验其是否在set里,若不在把它append到path中,加到set中就可。既然对一层for循环没问题,那么把放放入递归没问题。

代码实现

class Solution(object):def backtracking(self, nums, result, path, startIdx):if len(path) > 1:result.append(path[:])if startIdx == len(nums):returnuset = set()for i in range(startIdx, len(nums)):if (path and nums[i] < path[-1]) or nums[i] in uset:continuepath.append(nums[i])uset.add(nums[i])self.backtracking(nums, result, path, i+1)path.pop()def findSubsequences(self, nums):result, path = [], []self.backtracking(nums, result, path, 0)return result

46. 全排列

题目链接:46. 全排列 - 力扣(LeetCode)

思路

1.不需要startIdx

设定startIdx是为了不考虑之前遍历过的元素,但排列问题是有序的,比如对于数组[1,2],如果要求所有集合,得到[1,2]后,数组的第一位到了2,后面没有元素了,就直接结束,不用再从1开始看,因为[1,2]和[2,1]是一样的。但对于排列问题,它们不一样,所以如果第一位遍历到2,依然要考虑元素1。因此,排列问题不需要startIdx。

2. 去重

我们每添加新的一位元素,就要从数组第一位开始看,但要跳过已经添加到path中的自己。

代码实现

class Solution(object):def backtracking(self, nums, path, result):if len(path) == len(nums):result.append(path[:])  return         for i in range(len(nums)):if nums[i] in path:continuepath.append(nums[i])self.backtracking(nums, path, result)path.pop()def permute(self, nums):result, path = [], []self.backtracking(nums, path, result)return result

47. 全排列Ⅱ

题目链接:47. 全排列 II - 力扣(LeetCode)

思路

谨慎去重

nums包含重复数字,就不能只看当前遍历到的数字在不在path里。只能对自己去重,而不能去重和自己数值相同但序列和自己不同的元素。比如对于[1,1,2],我们先选1,下一位从[1,1,2]开始选,对于第一个1,是它本身,所以continue,对于第二个1,虽然和已有的1数值相同,但因为位置不同,是要加上去的。

代码实现

class Solution(object):def backtracking(self, nums, path, result, used):if len(path) == len(nums):result.append(path[:])returnuset = set()for i in range(len(nums)):if nums[i] in uset or used[i]:continuepath.append(nums[i])uset.add(nums[i])used[i] = Trueself.backtracking(nums, path, result, used)used[i] =Falsepath.pop()def permuteUnique(self, nums):path, result = [], []used = [False] * len(nums)self.backtracking(nums, path, result, used)return result

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中鼠标拖动触发滚动条的移动

前言 在做后端管理系统中&#xff0c;像弹窗或大的表单时&#xff0c;经常会有滚动条的出现&#xff0c;但有些时候如流程、图片等操作时&#xff0c;仅仅使用鼠标拖动滚动条操作不太方便&#xff0c;如果使用鼠标拖拽图片或容器来触发滚动条的移动就比较方便了 功能设计 如…

5分钟带你了解RESTful

RESTful API是一种基于HTTP协议的API设计风格&#xff0c;它以资源为核心&#xff0c;通过URL来访问和操作资源的状态。RESTful API遵循一些约定俗称的规则&#xff0c;包括使用HTTP动词&#xff08;GET、POST、PUT、DELETE等&#xff09;来操作资源&#xff0c;使用HTTP状态码…

开源软件运维安全防护的六个手段

开源&#xff0c;顾名思义&#xff0c;即开放软件源代码。代码贡献者可将自己编写的程序提交到开源社区的公开平台上&#xff0c;其他代码开发者如有类似的功能需求可以不必再自己动脑动手编写代码&#xff0c;而是直接集成、修改或应用贡献者公开的代码。 开源软件是通过特定…

深圳公司减资 深圳公司变更 深圳公司减资流程

新公司法从2024年7月1日起&#xff0c;全体股东需要在公司成立之日起五年内缴足认缴的出资额。这一变革在社会上引发了广泛的关注和热议。 如果您公司注册资金巨大&#xff0c;数千万甚至上亿&#xff0c;那么到了出资期限后&#xff0c;股东出资可能会面临困难。此时&#xf…

LeetCode(454)四数相加 II⭐⭐

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化&#xff0c;所有的 A, B, C, D 具有相同的长度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间&#…

Pinia处学习

修改数据的三种方式: mutate本次变化的数据,state时store中的数据

LeetCode每周五题_2024/01/08~01/12

文章目录 447. 回旋镖的数量 [01/08]题目题解 2707. 字符串中的额外字符 [01/09]题目题解 447. 回旋镖的数量 [01/08] 447. 回旋镖的数量 题目 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0…

大模型训练营Day2 homework

1.使用 InternLM-Chat-7B 模型生成 300 字的小故事 2.熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地&#xff1a; 下面开始下载和推广大模型的相关的包&#xff1a; 这里需要在本地上&…

uniapp自定义底部导航栏

1.新建 nav-custom.vue组件 <template><view class"nav-box" :style"{height:heightpx,background:bgColor}"><!-- 自定义导航栏 --><view class"status_bar" :style"{height:statusBarHeightpx}"><!-- u…

@Transactional 事务注解

第一、先简单介绍一下Spring事务的传播行为 所谓事务的传播行为是指&#xff0c;如果在开始当前事务之前&#xff0c;一个事务上下文已经存在&#xff0c;此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量&…

HarmonyOS应用开发学习笔记 UIAbility组件间交互 UIAbility启动,页面跳转结果回调

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

MySQL的体系结构(超全总结版)

MySQL组成 连接池组件管理服务和工具组件SQL接口组件查询分析器组件优化器组件缓冲组件插件式存储引擎物理文件 存储引擎 InnoDB存储引擎 主要面向OLTP(在线事务处理)方面的应用&#xff0c;特点是行锁设计、支持外键&#xff0c;默认情况下读取操作不会产生锁。通过使用多…

布隆过滤器的原理

布隆过滤器&#xff08;Bloom Filter&#xff09;是由Burton Howard Bloom在1970年提出的一种空间效率很高的概率型数据结构&#xff0c;它用来测试一个元素是否在一个集合中。布隆过滤器可以非常快速地进行插入和查询操作&#xff0c;并且非常节省空间&#xff0c;但它有一个小…

Centos7下升级gcc/g++版本(简单 + 避坑)

在 Centos7 下&#xff0c;使用 yum 安装高版本的 gcc/g 最简单&#xff1a; yum -y install centos-release-scl yum -y install devtoolset-11-gcc devtoolset-11-gcc-c devtoolset-11-binutils需要安装哪个个版本的gcc/g&#xff0c;就把数字替换成对应的版本号。例如上面代…

船舶3d虚拟展厅线上制作降低展示成本

VR线上虚拟展厅漫游搭建平台是一种新兴的技术&#xff0c;它能够为用户提供更加真实、沉浸式的体验。目前&#xff0c;市场上有许多公司提供VR线上虚拟展厅漫游搭建平台技术服务&#xff0c;为客户提供全方位的支持。 首先&#xff0c;这些公司通常会提供专业的策划和设计服务。…

TCP三次握手过程?

TCP三次握手过程&#xff1f; 分享 回答 1 浏览 3662 一颗小胡椒 2 CISM-WSE CISP-PTS 三次握手是 TCP 连接的建立过程。在握手之前&#xff0c;主动打开连接的客户端结束 CLOSE 阶段&#xff0c;被动打开的服务器也结束 CLOSE 阶段&#xff0c;并进入 LISTEN 阶段。随后进入…

常见的硬件连通性测试方法有哪些?

硬件连通性测试是确保硬件系统正常运行的关键一环。通过采用电气测试、数据传输测试和信号完整性测试等方法&#xff0c;可以有效发现和解决硬件连接中的问题&#xff0c;提高系统的可靠性和性能。 1、电气测试 通过使用示波器、多用途表等工具&#xff0c;对硬件设备的电气参数…

记一次线上报错 GList AddChildAt NullReferenceException

文章目录 问题描述分析结果总结 问题描述 后台日志大量报错&#xff0c;去主干看无法复现 c# exception:System.NullReferenceException: Object reference not set to an instance of an object. at FairyGUI.GCompone nt.AddChildAt (FairyGUI.GObject child, System.Int32 …

make的基本操作

./configure --with-name地址 &#xff08;相关库的安装路径&#xff09; make -jn //n指定最大核数 sudo make install //也可以指定安装目录 make install prefix路径 sudo ldconfig

二进制部署

HOST HostnameIP地址flannedAPPmaster192.169.116.10ETCD\APIserver\Scheduler\Controller-Managernode1192.168.116.11172.17.28.0ETCD,Flanned,Kubelet,kube-proxynode2192.168.116.12172.17.26.0ETCD,Flanned,Kubelet,kube-proxy Kubernetes社区 Kubernetes文档 ETCD mas…