代码随想录算法训练营第三十一天 | 56.合并区间 738.单调递增的数字 968.监控二叉树

LeetCode 56.合并区间:

文章链接
题目链接:56.合并区间

思路:

① 合并所有重叠的区间,合并后的区间数组不重叠,因此下面两种多区间重叠,其中的区间都要进行合并
在这里插入图片描述
② 合并区间:因为情况2也算作是重叠区间,因此采用先按左端点顺序排列,再求重叠区间最大右端点的方式。(顺序的话判断重叠是左端点是否小于重叠的最大右端点;逆序排列的话是右端点是否大于重叠的最小左端点)
逆序如下图:
在这里插入图片描述
③ 具体代码实现

  1. 使用left和maxRight记录合并后区间的左端点和最大右端点,当下一个区间不重叠时将[left, maxRight]加入result中
    需要注意的是: for循环遍历完成后,result中还有一个区间没有加入
class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:if len(intervals) <= 0:return []intervals.sort(key=lambda x:x[0])   # 按左端点排序left = intervals[0][0] # 当前重叠区间合并后的左端点maxRight = intervals[0][1]    # 最大重叠区间右端点result = []for i in range(1, len(intervals)):if intervals[i][0] > maxRight:  # 不重叠result.append([left, maxRight])# 重置重叠区间左右端点left = intervals[i][0]maxRight = intervals[i][1]else:maxRight = max(maxRight, intervals[i][1])# 最后还有一个result.append([left, maxRight])return result
  1. 区间不重叠时直接将其加入result中,后面判断重叠的话再进行合并,合并方式是更新其最大右端点。数组是按照左端点排序的,因此区间的左端点就是最小左端点
class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:if len(intervals) <= 0:return []intervals.sort(key=lambda x:x[0])   # 按左端点排序result = [intervals[0]] # 将第一个元素加入result中for i in range(1, len(intervals)):if intervals[i][0] <= result[-1][1]:    # 重叠result[-1][1] = max(result[-1][1], intervals[i][1]) # 更新右端点,左端点一定是最小的,因为是按照左端点排序else:result.append(intervals[i]) # 将区间加入列表中return result

感悟:

首先分析清楚需要的判断的重叠情况,然后根据排序遍历方式怎么判断是否重叠;最后记录的方式是使用两个额外的变量记录还是就使用result的最后一个元素记录。
只要是顺序排列(无论是按左端点还是右端点),从前往后遍历的话,都是判断新左端点是否小于重叠右端点。逆序遍历方式相同,判断重叠是新右端点是否大于重叠左端点


LeetCode 738.单调递增的数字:

文章链接
题目链接: 738.单调递增的数字

思路:

遇到 nums[i - 1] > nums[i],将nums[i - 1] -= 1,然后num[i:]全部修改为9。
那么可以采用的遍历方式为从前往后和从后往前

  1. 从前往后
    从前往后的话,如果nums[i] > nums[i + 1],nums[i ] -= 1之后,可能导致nums[i - 1] > nums[i],因此我们找到的解决办法为:
    ① 因为nums[i] -= 1之后如果出现nums[i - 1] > nums[i]的情况的话,只可能为nums[i]修改前,nums[i] == nums[i - 1]。
    ② 因此我们找到nums[i] > nums[i + 1]之后,从 i 开始向前找,直到nums[i] != nums[i - 1],那么这个下标 i 对应的值就是 - 1的正确位置,nums[i:]都修改为9
    ③ 此处将后面修改为9的方式为,以333332举例,3*(10^5) - 1
class Solution:def monotoneIncreasingDigits(self, n: int) -> int:if n < 10:return nnums = []count, newN = 0, n  # 记录nums元素个数,即n的位数while newN > 0:nums.append(newN % 10)newN = newN // 10count += 1nums = nums[::-1]# 找到修改的下标的正确位置index = 0while index < count - 1 and nums[index] <= nums[index + 1]:index += 1if index == count - 1:  # n是单调递增的return nelse:   # # 从index向前找,直到数字不相同while index > 0 and nums[index] == nums[index - 1]:index -= 1# 构造单调递增且小于n的最大整数res = 0for i in range(0, index + 1):res = res * 10 + nums[i]res *= pow(10, count - 1 - index)res -= 1    # 即nums[index] -= 1,nums[index:]全为9return res
  1. 从后向前遍历
    从后向前遍历的话,nums[i - 1] > nums[i],从而nums[i - 1] -= 1,再向前遍历时能够用到新的nums[i - 1]进行判断,同时使用flag记录修改为9的开始位置。
class Solution:def monotoneIncreasingDigits(self, n: int) -> int:if n < 10:return nstrN = list(str(n))   # 将整数转换为字符串列表flag = len(strN)    # flag设置9从哪里开始,初始化为len(strN)防止flag没被赋值时循环赋9开始# 从后往前遍历for i in range(len(strN) - 1, 0, -1):if strN[i - 1] > strN[i]:flag = i    # 9开始的位置strN[i - 1] = str(int(strN[i - 1]) - 1)# 以flag开始的位置都赋值为9for i in range(flag, len(strN)):strN[i] = '9'# 将列表转换为字符串后再转换为整数res = int(''.join(strN))return res

感悟:

① 字符串可以通过索引访问,但是不能通过索引修改。如果想要修改的话,使用list()将其转换为列表后修改
② 从列表转换回字符串为’‘.join(list1),join前面的’'的两个单引号之间的元素为将列表转换为字符串时,列表中每个元素之间衔接的元素
③ 整数转换为字符串,或者数字字符串转换为整数直接转换即可


LeetCode 968.监控二叉树:

文章链接
题目链接:968.监控二叉树

思路:

本道题很难,具体思路分为多个方面
1)用到了贪心:因为给一个节点放摄像头可以覆盖的范围有上中下,因此我们应当给叶子节点的parent节点放摄像头(为了覆盖叶子节点且摄像头覆盖范围更大)。那么接着继续向上推,此时,因为parent节点放了摄像头,因此parent.parent被覆盖了,为了摄像头数目更少,即摄像头覆盖范围更广,因此我们对放了摄像头parent向上间隔两个节点再放摄像头。
在这里插入图片描述
2)根据上面的贪心,二叉树的遍历方式应当为后序遍历。那么二叉树的节点一共有三种状态,分别为0:无覆盖,1:有摄像头,2:有覆盖。
3)那么后序遍历根据左右孩子的状态,那么parent节点应当为什么状态也有多种情况。

  • 3.1 情况1:左右孩子均为有覆盖
    那么parent节点应当为状态0,无覆盖的情况返回给上一层,从而上一层的parent节点会放置摄像头来覆盖。
  • 3.2 情况2:左右孩子至少有一个无覆盖
    那么parent节点应当被放置摄像头来覆盖到左右孩子,即parent节点为状态1
  • 3.3情况3:左右孩子至少有一个有摄像头(且没有无覆盖的情况)
    那么parent节点应当为状态2,有覆盖。
  • 3.4情况4遍历完成后根节点无覆盖
    因为我们的贪心思路是放置摄像头后隔两个节点再放置摄像头,那么对于下面这种情况。根节点在遍历完成后仍然是无覆盖的情况,此时需要在根节点也放置摄像头。
    在这里插入图片描述
    最后:采用的是递归的后序遍历,函数返回值为当前节点的状态,边界条件为空节点,那么空结点也需要对应的状态来返回。
    • 如果空结点返回0,那么其parent节点如果是叶子节点的话,一定会被放置摄像头,与贪心相违背。
    • 如果空结点返回1,那么其parent节点如果是叶子节点的话,状态为2(有覆盖),那么叶子节点的parent节点不会被放置摄像头,与贪心相违背
    • 因此,空节点只能返回2,有覆盖,那么其parent节点如果为叶子节点不会被放置摄像头,但是叶子节点的parent节点会被放置摄像头;如果其parent节点不是叶子节点的话,parent节点能够根据其存在的孩子节点的状态确定自己的状态,并且不会收到空节点影响
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def minCameraCover(self, root: Optional[TreeNode]) -> int:self.result = 0if self.traversal(root) == 0:   # 情况4,遍历完成后根节点还是无覆盖self.result += 1return self.resultdef traversal(self, node):if not node:return 2left = self.traversal(node.left)    # 左right = self.traversal(node.right)  # 右# 根if left == 2 and right == 2:return 0if left == 0 or right == 0:self.result += 1return 1if left == 1 or right == 1:return 2return -1

感悟:

贪心-遍历顺序-状态-多种情况-空节点状态-最后根节点情况


学习收获:

不需要对题目具体分析贪心的思路,而是先具体分析题目,在分析题目的过程中自然想到贪心,最后实现贪心。主要需要对题目的各种情况分析清楚,同时对于多维度的情况,分析清楚都有什么维度再确定一个维度再确定另一个维度(这个需要想到了先模拟一遍,再具体代码实现)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[ComfyUI]FaceAging:太好玩啦!FaceAging终于装好了!负50到正100岁随心调整!超强又难装的节点安装教程来了! Comfyui教程

大家好&#xff01;今天我要向大家介绍一个超级有趣的话题——[ComfyUI]FaceAging&#xff01;这个工具能够让你轻松实现人脸年龄的调整&#xff0c;从负50岁到正100岁&#xff0c;让你的创作更加有趣和独特。 想象一下&#xff0c;你有一个强大的AI助手&#xff0c;它能够根据…

蓝桥杯真题——乐乐的序列和(C语言)

问题描述 乐乐在玩一个游戏&#xff0c;她有一排宝石&#xff0c;每个宝石上都刻有一个整数值。她的目标是从中挑选出一些宝石&#xff0c;使得选出的宝石数量为偶数&#xff0c;且这些宝石上的数字总和最大。如果不选任何宝石&#xff08;即选出宝石数量为 00&#xff0c;也是…

猫用宠物空气净化器哪个牌子好?求噪音小的宠物空气净化器推荐!

最近真是烦躁到了顶峰&#xff01;猫咪换毛季太折磨人了&#xff0c;白天上班累的要死&#xff0c;晚上回家还要和猫毛斗争。每天回家都是一场豪赌&#xff0c;需要花费的清理时间取决于家里的猫毛散落程度。有时候忙起来完全不想管&#xff0c;回到家只想躺着。 但最近身体出…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …

32位汇编——通用寄存器

通用寄存器 什么是寄存器呢&#xff1f; 计算机在三个地方可以存储数据&#xff0c;第一个是把数据存到CPU中&#xff0c;第二个把数据存到内存中&#xff0c;第三个把数据存到硬盘上。 那这个所谓的寄存器&#xff0c;就是CPU中用来存储数据的地方。那这个寄存器有多大呢&a…

1.1 OpenCV准备工作

介绍了如何在Windows系统中配置Python和Anaconda环境&#xff0c;并安装OpenCV库。首先从Python官网下载并安装Python&#xff0c;然后配置环境变量。接着安装Anaconda&#xff0c;并通过Anaconda Navigator或Prompt管理包。最后&#xff0c;在Anaconda Prompt中使用pip命令安装…

在gitlab,把新分支替换成master分支

1、备份master分支&#xff0c;可以打tag 2、删除master分支 正常情况下&#xff0c;master分支不允许删除&#xff0c;需要做两个操作才能删除 a、变更项目默认分支为非master分支&#xff0c;可以先随便选择 b、取消master为非保护分支 操作了上述两步&#xff0c;就可以删…

【专题】产业全球化视角下中国企业出海人才趋势洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38107 在当今全球化进程不断加速的时代背景下&#xff0c;出海业务已成为众多企业拓展市场、实现可持续发展的重要战略方向。随着世界经济的紧密联系&#xff0c;不同国家和地区的市场机遇与挑战并存。文末202份出海行业研究报告最新…

uniapp vue3 使用echarts-gl 绘画3d图表

我自己翻遍了网上&#xff0c;以及插件市场&#xff0c;其实并没有uniapp 上使用echarts-gl的样例&#xff0c;大多数都是使用插件市场的echarts的插件 开始自己尝试直接用echartsgl 没有成功&#xff0c;后来尝试使用threejs 但是也遇到一些问题&#xff0c;最后我看官网的时…

世窗健康亮相第三届中国营养师发展大会——AI赋能营养健康 共建人类健康共同体

近日,为贯彻落实《“健康中国2030”规划纲要》,加强营养健康人才队伍建设,推动中国营养健康产业迈向高质量发展。由中国营养师发展大会组委会主办,全国各地营养师协会等多家机构共同发起的第三届中国营养师发展大会在石家庄市成功举办。作为深耕数字健康领域多年的综合服务运营…

基于 GADF+Swin-CNN-GAM 的高创新轴承故障诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

ubuntu20.04安装ros与rosdep

目录 前置配置 配置apt清华源 配置ros软件源 添加ros安装源&#xff08;中科大软件源&#xff09; 设置秘钥 更新源 ros安装 安装ros 初始化 rosdep 更新 rosdep 设置环境变量 安装 rosinstall 安装验证 启动海龟仿真器 操控海龟仿真器 rosdep安装更新 安装 使用…

20241105,LeetCode 每日一题,用 Go 实现两数之和的非暴力解法

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 …

【C++】C++的单例模式

二十四、C的单例模式 1、C的单例模式 本小标题不是讨论C的语言特性&#xff0c;而是一种设计模式&#xff0c;用于确保一个类在任何情况下都只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。即C的单例模式。这种模式常用于资源管理&#xff0c;如‌线程池、‌缓…

软考的项目管理认证和PMP认证哪个含金量高?

软考高项比较适用于计算机 IT 行业&#xff0c;而 PMP 不受行业限制&#xff0c;各行各业都适用&#xff0c;没有哪个含金量更高的说法 至于哪个更合适&#xff0c;看你想去国企还是民企&#xff0c;国企软考吃香&#xff0c;外企PMP 吃香 两者具体有什么区别呢~~ 一、概念区…

比ChatGPT更牛!苹果新AI模型刷新交互体验!能看懂你的手机屏幕!平板和安卓机也都行

家人们&#xff0c;苹果一直在悄悄进步&#xff01; 近期&#xff0c;据小鹿观察&#xff0c;各大科技巨头不仅在提升模型解决复杂问题的能力上竞争激烈&#xff0c;而且还在大语言模型应用于用户界面&#xff08;UI&#xff09;交互方面上暗暗发力&#xff01; 最近&#xf…

C++练习题(1)

//C交换两个数的值 #include <iostream> using namespace std; int main() { int a,b,temp; scanf("%d %d",&a,&b); tempa; ab; btemp; printf("%d %d",a,b); return 0; } //C交换两个数的值 #include <…

Docker:namespace隔离实战

上一篇&#xff1a;容器化和虚拟化 namespace namespace通过一种内核技术来实现&#xff0c;允许将不同的系统资源隔离和封装到独立的命名空间中。 为容器化、虚拟化和隔离提供强大的基础。通过使用namespace技术&#xff0c;Linux内核可以创建多个独立的命名空间&#xff0…

生物医药产业前景如何?怎样开展生物医药产业分析?

▶生物医药产业前景 生物医药产业的前景是非常广阔的&#xff0c;主要呈现以下几大特点&#xff1a; 1.市场规模增长&#xff1a;预计到2029年&#xff0c;中国医药制造规上企业营业收入将达到5.4万亿元&#xff0c;2024-2029年年均增长率达到14.04%。这表明生物医药产业将继…

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索&#xff1a;超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker&#xff0c;通过dockers镜像安装很方便&#xff0c;且很快&#xff1b;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像&#xff1b; docker search awvs…