当前位置: 首页 > news >正文

代码随想录算法训练营第三十天 | 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间

LeetCode 452.用最少数量的箭引爆气球:

文章链接
题目链接:452.用最少数量的箭引爆气球

思路:

气球的区间有重叠部分,只要弓箭从重叠部分射出来,那么就能减少所使用的弓箭数
**局部最优:**只要有重叠部分,就从重叠部分射出弓箭
全局最优:引爆所有气球所必须射出的最小弓箭数。

① 要求重叠部分最好先将points数组排序,按start或end都可以,此处按照start顺序排序。
② 因为只需要弓箭的数目,因此不需要记录有哪些重叠区间,只需要变量minRight记录重叠气球最小右边界和count记录弓箭数即可。
在这里插入图片描述
③ 从前向后遍历,如果当前气球与之前气球区间有重叠部分,即points[i][0] <= minRight,那么更新minRight;如果没有重叠部分,重置minRight为points[i][1]重新记录重叠气球最小右边界,并增加一支弓箭

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if len(points) <= 0:return 0points.sort(key=lambda x: x[0])count = 1   # points不为空,至少需要一支箭minRight = points[0][1] # 记录最小右边界,因为有重叠部分右边界只会减小for point in points:if point[0] > minRight: # 没挨着minRight = point[1]    # 重置minRightcount += 1  # 增加一支箭else:minRight = min(minRight, point[1])  # 得到最小右边界return count"""
不使用minRight记录,使用points[i - 1][1]记录最小右边界
"""
class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if len(points) <= 0:return 0points.sort(key=lambda x: x[0]) # 排序count = 1   # points不为空至少需要一支弓箭for i in range(1, len(points)):if points[i][0] > points[i - 1][1]: # 当前气球区间与前一个没有挨着count += 1else:points[i][1] = min(points[i - 1][1], points[i][1])  # 更新最小右边界return count

感悟:

只记录数量的话,函数实现过程中不用记录所有重叠区间,使用一个变量记录当前重叠气球最小右边界即可(因为排序后如果当前气球与前面不重叠的话,原来的重叠气球部分与之后的不会重叠了,那么就只需要记录新的即可)


LeetCode 435.无重叠区间:

文章链接
题目链接:435.无重叠区间

思路:

一般来说,多个区间重叠有两种情况:以三个区间重叠为例
1)第三个区间的重叠部分在前两个区间的重叠部分中。
那么需要删除其中两个区间才能使区间不重叠
在这里插入图片描述
2)第三个区间的重叠部分不在前两个区间的重叠部分中。
那么只需要删除中间的区间就能使得两个区间不重叠。
在这里插入图片描述
如果采用的是两个区间重叠后保留的是重叠部分,再与后面的区间进行判断是否重叠,那么可以统一上面两种情况(第二种情况到第三个区间时会判断不重叠)。

  1. 记录重叠部分
    那么我们首先对区间集合按照左边界进行排序,同时使用minRight记录重叠区间的最小右边界,count记录重叠区间数。
class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if len(intervals) <= 0:return 0intervals.sort(key=lambda x: x[0])count = 0   # 记录重叠的区间数minRight = intervals[0][1]for i in range(1, len(intervals)):if intervals[i][0] >= minRight:minRight = intervals[i][1]else:count += 1minRight = min(minRight, intervals[i][1])return count
  1. 记录不重叠部分
    其实记录不重叠部分可以对上面的代码进行修改,count += 1从else改成if, 同时初始化为1即可。
    还有一种方法,因为判断是否重叠采用的是重叠部分最小右边界,因此是否可以直接对数组按照右边界进行排序,如果后面的区间与前面不重叠,重置最小右边界;否则不进行操作(因为按照右边界排序,前面重叠部分第一个一定是最小右边界)
class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if len(intervals) <= 0:return 0intervals.sort(key=lambda x:x[1])   # 按右边界进行排序count = 1   # 记录非重叠区间数minRight = intervals[0][1]for i in range(1, len(intervals)):if intervals[i][0] >= minRight:	# 不重叠count += 1minRight = intervals[i][1]return len(intervals) - count

感悟:

判断是否重叠采用的是重叠最小右边界,n个区间是否重叠是看前面n - 1个的重叠部分是否在第n个区间中出现(即上图情况1)。使用最小右边界进行判断,可以直接对数组按照右边界进行排序,从而只需要在不重叠时重置minRight即可。


LeetCode 763.划分字母区间:

文章链接
题目链接:763.划分字母区间

思路:

  1. 贪心1(可能不算贪心)
    ① 首先求出字符串中每个字符的最远位置(用数组)
    ② 遍历字符串,同时更新当前遍历片段的最远位置(即其中字符最远位置的最远位置),如果当前位置为最远位置,表明到达切分点,对字符串进行切分后继续遍历下一片段
class Solution:def partitionLabels(self, s: str) -> List[int]:if len(s) <= 0:return []hashLetter = [-1] * 26  # 保存字符的最远下标for i in range(len(s)):hashLetter[ord(s[i]) - ord('a')] = iresult = []start = 0   # 当前片段开始maxIndex = 0 # 当前片段中字符中最远位置的最远位置,即当前片段结束for i in range(len(s)):# 更新最远位置if hashLetter[ord(s[i]) - ord('a')] > maxIndex:maxIndex = hashLetter[ord(s[i]) - ord('a')]if maxIndex == i:    # 到达最远位置即片段结束result.append(i - start + 1)    # 双闭区间# 重置start等为下一个片段start = i + 1maxIndex = 0return result
  1. 贪心2
    类似前面引爆气球和无重叠区间的思路。
    ① 记录字符串中每个字符的开始位置和结束位置,从而得到一系列区间
    ② 首先对区间按照左边界进行排序,然后对重叠的区间进行合并,此处判断多个区间是否重叠包含如下两种情况
    1)第三个区间的重叠部分在前两个区间的重叠部分中。
    在这里插入图片描述
    2)第三个区间的重叠部分不在前两个区间的重叠部分中。
    在这里插入图片描述
    ③ 从而使用最大右边界记录当前重叠区间的右边界。如果下一个区间没有和当前区间重叠,说明重叠结束,应当划分片段。
    需要注意的是:
    1)记录字符的开始和结束位置,记录开始位置的同时要记录结束位置(因为会出现字符只出现一次的情况
    2)前面记录字符的开始和结束采用的是数组,字符到数组下标的映射为ord(x) - ord(‘a’),因此在排序区间数组前需要清理掉字符串中没有用到的字符。
    3)前面几题只需要记录数量,此处需要划分区间,因此需要start记录区间的开始
    4)for循环遍历完成后,还有最后一个区间没有加入result中
class Solution:def countLetter(self, s):# 记录字符串中每个字符的开始和结束位置letterSE = [[-1, -1] for _ in range(26)]for i in range(len(s)):if letterSE[ord(s[i]) - ord('a')][0] == -1:letterSE[ord(s[i]) - ord('a')][0] = iletterSE[ord(s[i]) - ord('a')][1] = i# 去除letterSE的s不存在的字符letters = []for i in range(len(letterSE)):if letterSE[i][0] != -1:letters.append(letterSE[i])return lettersdef partitionLabels(self, s: str) -> List[int]:if len(s) <= 0:return 0letters = self.countLetter(s)   # 得到各个字符的区间letters.sort(key=lambda x: x[0])    # 按照左边界排序# 字符串中多个字符重叠区间的最大值即为所划分区间result = []start = 0maxRight = letters[0][1]    # 这里是求最大右边界for i in range(1, len(letters)):if letters[i][0] > maxRight:    # 没挨着result.append(maxRight - start + 1)start = letters[i][0]maxRight = max(letters[i][1], maxRight)# 结尾一个result.append(maxRight - start + 1)return result

学习收获:

区间是否重叠,以及如何求存在重叠部分的重叠区间数和非重叠区间数,以及合并区间

相关文章:

代码随想录算法训练营第三十天 | 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间

LeetCode 452.用最少数量的箭引爆气球&#xff1a; 文章链接 题目链接&#xff1a;452.用最少数量的箭引爆气球 思路&#xff1a; 气球的区间有重叠部分&#xff0c;只要弓箭从重叠部分射出来&#xff0c;那么就能减少所使用的弓箭数 **局部最优&#xff1a;**只要有重叠部分…...

海亮科技亮相第84届中国教装展 尽显生于校园 长于校园教育基因

10月25日&#xff0c;第84届中国教育装备展示会&#xff08;以下简称“教装展”&#xff09;在昆明滇池国际会展中心开幕。作为国内教育装备领域规模最大、影响最广的专业展会&#xff0c;本届教装展以“数字赋能教育&#xff0c;创新引领未来”为主题&#xff0c;为教育领域新…...

C语言数据结构学习:栈

C语言 数据结构学习 汇总入口&#xff1a; C语言数据结构学习&#xff1a;[汇总] 1. 栈 栈&#xff0c;实际上是一种特殊的线性表。这里使用的是链表栈&#xff0c;链表栈的博客&#xff1a;C语言数据结构学习&#xff1a;单链表 2. 栈的特点 只能在一端进行存取操作&#x…...

如何快速分析音频中的各种频率成分

从视频中提取音频 from moviepy.editor import VideoFileClip# Load the video file and extract audio video_path "/mnt/data/WeChat_20241026235630.mp4" video_clip VideoFileClip(video_path)# Extract audio and save as a temporary file for further anal…...

MongoDB 6.0 主从复制配置

以下是 MongoDB 6.0 版本配置主从的详细安装步骤&#xff1a; 1. 安装 MongoDB&#xff1a;可以从官网下载 MongoDB 6.0 的安装包并进行安装&#xff0c;或者使用相应的包管理工具进行安装。 2. 配置主节点&#xff1a;在主节点的 MongoDB 配置文件&#xff08;默认路径为 …...

NPU 神经网络处理单元

Ⅰ 什么是 NPU&#xff1f; 当前正处于神经网络和机器学习处理需求爆发的初期。传统的 CPU&#xff08;中央处理器&#xff09;/GPU&#xff08;图形处理器&#xff09;可以执行类似任务&#xff0c;但专门为神经网络优化的 NPU&#xff08;神经处理单元&#xff09;比 CPU/GP…...

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…...

Vulkan 开发(五):Vulkan 逻辑设备

图片来自《Vulkan 应用开发指南》 Vulkan 开发系列文章&#xff1a; 1. 开篇&#xff0c;Vulkan 概述 2. Vulkan 实例 3. Vulkan 物理设备 4. Vulkan 设备队列 在 Vulkan 中&#xff0c;逻辑设备&#xff08;Logical Device&#xff09;是与物理设备&#xff08;Physical D…...

Kafka 解决消息丢失、乱序与重复消费

一、引言 在分布式系统中&#xff0c;Apache Kafka 作为一种高吞吐量的分布式发布订阅消息系统&#xff0c;被广泛应用于日志收集、流式处理、消息队列等场景。然而&#xff0c;在实际使用过程中&#xff0c;可能会遇到消息丢失、乱序、重复消费等问题&#xff0c;这些问题可能…...

计算机专业毕业生面试工具推荐:白瓜面试

随着毕业季的临近&#xff0c;计算机专业的毕业生们即将步入职场&#xff0c;面试成为了他们必须面对的挑战。在这个过程中&#xff0c;选择合适的面试工具可以大大提高求职成功率。今天&#xff0c;我要向大家推荐一款专为计算机专业毕业生设计的面试工具——白瓜面试。 为什…...

数字IC开发:布局布线

数字IC开发&#xff1a;布局布线 前端经过DFT&#xff0c;综合后输出网表文件给后端&#xff0c;由后端通过布局布线&#xff0c;将网表转换为GDSII文件&#xff1b;网表文件只包含单元器件及其连接等信息&#xff0c;GDS文件则包含其物理位置&#xff0c;具体的走线&#xff1…...

高空作业未系安全带监测系统 安全带穿戴识别预警系统

在各类高空作业场景中&#xff0c;安全带是保障作业人员生命安全的关键防线。然而&#xff0c;由于人为疏忽或其他原因&#xff0c;作业人员未正确系挂安全带的情况时有发生&#xff0c;这给高空作业带来了巨大的安全隐患。为有效解决这一问题&#xff0c;高空作业未系安全带监…...

k8s的配置和存储(ConfigMap、Secret、Hostpath、EmptyDir以及NFS的服务使用)

ConfigMap 简介 在 Kubernetes 中&#xff0c;ConfigMap 是一种用于存储非敏感信息的 Kubernetes 对象。它用于存储配置数据&#xff0c;如键值对、整个配置文件或 JSON 数据等。ConfigMap 通常用于容器镜像中的配置文件、命令行参数和环境变量等。 ConfigMap 可以通过三种方…...

JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…...

使用 Kafka 和 MinIO 实现人工智能数据工作流

MinIO Enterprise Object Store 是用于创建和执行复杂数据工作流的基础组件。此事件驱动功能的核心是使用 Kafka 的 MinIO 存储桶通知。MinIO Enterprise Object Store 为所有 HTTP 请求&#xff08;如 PUT、POST、COPY、DELETE、GET、HEAD 和 CompleteMultipartUpload&#xf…...

力扣题86~90

题86&#xff08;中等&#xff09;&#xff1a; python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def partition(self, head: Optional[Li…...

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …...

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…...

进一步认识ICMP协议

在日常工作中&#xff0c;我们经常需要判断网络是否连通&#xff0c;相信大家使用较多的命令就是 ping啦。ping命令是基于 ICMP 协议来实现的&#xff0c;那么什么是 ICMP 协议呢&#xff1f;ping命令又是如何基于 ICMP 实现的呢&#xff1f; 今天这篇文章&#xff0c;我们就来…...

NUUO网络视频录像机upload.php任意文件上传漏洞复现

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 NUUO网络视频录像机&#xff08;Network Video Recorder&#xff0…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...