算法打卡day31

今日任务:

1)435.无重叠区间

2)763.划分字母区间

3)56.合并区间

435.无重叠区间

题目链接:435. 无重叠区间 - 力扣(LeetCode)

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。示例 3:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间哔哩哔哩bilibili

思路:

  1. 排序:首先,我们需要对区间集合按照区间的左边界进行排序,这样可以确保后续的区间处理是按照左边界的顺序进行的。

  2. 遍历:接下来,我们从第二个区间开始遍历,逐个检查当前区间和前一个区间是否重叠。

  3. 判断重叠:如果当前区间的起始位置在前一个区间的结束位置之后,表示两个区间不重叠,我们将当前区间的结束位置更新为新的不重叠区间的结束位置。

  4. 移除区间:如果当前区间和前一个区间重叠了,我们需要移除一个区间。由于我们希望尽可能少地移除区间,因此选择移除当前区间的策略是优先选择与前一个区间重叠时间较短的区间。

  5. 更新不重叠区间的结束位置:如果当前区间的结束位置在前一个区间的结束位置之前,我们将更新不重叠区间的结束位置为当前区间的结束位置。

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:# 如果区间集合为空,返回0if not intervals:return 0intervals.sort(key=lambda x: x[0])# 初始化移除区间的数量为0remove_count = 0# 初始化上一个不重叠区间的结束位置为第一个区间的结束位置end = intervals[0][1]for i in intervals[1:]:# 存在重叠区间if i[0] < end:# 更新重叠区间的右边界:选一个结束位置小的区间,减少重叠end = min(i[1],end)remove_count += 1else:end = i[1]return remove_count

感想:与上一题气球一样,删除重叠区间

763.划分字母区间

题目链接:763. 划分字母区间 - 力扣(LeetCode)

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。示例:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。提示:
S的长度在[1, 500]之间。
S只包含小写字母 'a' 到 'z' 。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间哔哩哔哩bilibili

思路:

要求尽可能多的片段,且同一字母最多出现在一个片段中。首先需要遍历一次字符串,记录每个字母最后出现的位置。然后再次遍历字符串,记录当前片段的开始位置和结束位置,保证当前片段内的字母不会出现在其他片段中。当遍历到一个字母的结束位置时,表示当前片段结束,可以将当前片段的长度添加到结果列表中。

具体步骤如下:

  1. 第一次遍历字符串,记录每个字母最后出现的位置,可以使用字典来存储每个字母的最后出现位置。
  2. 第二次遍历字符串,使用两个变量 startend 来表示当前片段的开始位置和结束位置,初始时均为 0。遍历过程中,更新 end 为当前字母的最后出现位置。
  3. 当遍历到当前位置等于 end 时,表示当前片段结束,可以将当前片段的长度添加到结果列表中,并更新 start 为下一个片段的起始位置(即 end + 1)。

class Solution:def partitionLabels(self, s: str) -> List[int]:last_index = {}  # 记录每个字母最后出现的位置for i, char in enumerate(s):last_index[char] = iresult = []  # 存储结果的列表start = end = 0  # 当前片段的起始位置和结束位置for i, char in enumerate(s):end = max(end, last_index[char])  # 更新当前片段的结束位置if i == end:  # 当前位置等于结束位置,表示当前片段结束result.append(end - start + 1)  # 将当前片段的长度添加到结果列表中start = end + 1  # 更新下一个片段的起始位置return result

56.合并区间

题目链接:56. 合并区间 - 力扣(LeetCode)

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例 1:
输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:
输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,合并区间有细节!LeetCode:56.合并区间哔哩哔哩bilibili

思路:

首先对输入的区间列表 intervals 按照区间的起始位置进行排序。然后,使用一个空列表 result 存储合并后的区间。

接下来,我们遍历排序后的区间列表,逐个考虑每个区间和当前合并后的最后一个区间之间的关系。

  • 如果当前区间和当前合并后的最后一个区间有重叠,我们将它们合并成一个区间,即更新当前合并后的最后一个区间的结束位置为这两个区间的结束位置的最大值。
  • 否则,当前区间和当前合并后的最后一个区间无重叠,我们将当前合并后的区间加入到 result 列表中,并更新当前合并后的区间为当前区间。

最后,将最后一个合并后的区间加入到结果列表中,并返回合并后的不重叠的区间列表 result

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# 按照区间的起始位置进行排序intervals.sort(key=lambda x:x[0])# print(intervals)result = [] # 存储合并后的区间# 初始化起始位置和结束位置为第一个区间的起始位置和结束位置start = intervals[0][0]end = intervals[0][1]# 遍历排序后的区间列表for i in intervals[1:]:# 如果当前区间的起始位置小于等于当前合并后的最后一个区间的结束位置,# 则更新当前合并后的最后一个区间的结束位置为这两个区间的结束位置的最大值if i[0] <= end:end = max(end,i[1])else:# 否则,当前区间和当前合并后的最后一个区间无重叠,# 将当前合并后的区间加入到结果列表中,并更新起始位置和结束位置为当前区间的起始位置和结束位置result.append([start,end])start = i[0]end = i[1]# 将最后一个合并后的区间加入到结果列表中result.append([start, end])return result

这种思路比较好理解,我们可以根据上面的代码进行改进

直接将区间添加到结果集,与下一个区间比较,更新右边界

class Solution:def merge2(self, intervals: List[List[int]]) -> List[List[int]]:# 按照区间的起始位置进行排序intervals.sort(key=lambda x: x[0])merged = []  # 存储合并后的区间for interval in intervals:# 如果merged为空,或当前区间的起始位置大于当前合并后的最后一个区间的结束位置,则直接将当前区间加入到merged中if not merged or interval[0] > merged[-1][1]:merged.append(interval)else:# 否则,更新当前合并后的最后一个区间的结束位置为这两个区间的结束位置的最大值merged[-1][1] = max(merged[-1][1], interval[1])return merged

题目中说明了集合长度至少为1,说明没有空集合,但是这个为了代码的完整性,改进代码还是补充了判空

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

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

相关文章

【北京迅为】《iTOP-3588开发板系统编程手册》第5章 文件IO缓存

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

【刷题】代码随想录算法训练营第十三天|239、滑动窗口最大值,347、前K个高频元素,总结

目录 39、滑动窗口最大值347、前K个高频元素栈与队列总结 39、滑动窗口最大值 讲解&#xff1a;https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html 使用单调队列。 在代码随想录里好好理解一下单调队列处理这道滑动窗口最…

WebApis知识总结以及案例(续3)

综合案例 小兔鲜页面注册 分析业务模块 发送验证码模块 用户点击之后&#xff0c;显示05 秒后重新获取 时间到了&#xff0c;自动改为重新获取 //1.发送短信验证码模块const codedocument.querySelector(.code)let flagtrue//通过一个变量来控制 节流阀 // 1.1 点击事件co…

【MATLAB源码-第51期】基于matlab的粒子群算法(PSO)的栅格地图路径规划。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都…

盲人专用软件定制开发:突破出行壁垒,点亮生活之路

身为一名资深记者&#xff0c;我始终关注着各类社会群体面临的挑战与应对策略。今天&#xff0c;我将目光投向了一个特殊群体——盲人&#xff0c;以及一款旨在破解他们独立出行难题的盲人专用软件。这款应用叫做蝙蝠避障&#xff0c;它通过定制开发&#xff0c;以先进的技术手…

第九届少儿模特明星盛典 全球赛首席体验官『韩嘉滢』精彩回顾

2024年1月30日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”&#xff01;由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官&#xff01;近2000名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff…

【算法】删除链表中重复元素

本题来源---《删除链表中重复元素》。 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入…

46.HarmonyOS鸿蒙系统 App(ArkUI)网格布局

Grid(){GridItem(){Button(按钮1).fontSize(28)}.backgroundColor(Color.Blue)GridItem(){Text(数学).fontSize(28)}.backgroundColor(Color.Yellow)GridItem(){Text(语文).fontSize(28)}.backgroundColor(Color.Green)GridItem(){Text(英语).fontSize(28)}.backgroundColor(Co…

极速充电!一键解决苹果手机充电慢的问题

现如今&#xff0c;手机是我们日常生活中不可或缺的一部分&#xff0c;我们经常会使用它来刷短剧、看小说、读新闻等。然而&#xff0c;有时我们可能会遇到苹果手机充电慢的问题&#xff0c;这不仅影响了手机的用户体验&#xff0c;还可能给我们的生活带来一些不便。 遇到这种…

单细胞核转录组——植物:叶叶我呀裂开啦~

单细胞转录组测序技术能够在单细胞分辨率下研究样本的转录组信息&#xff0c;可以完美解决细胞异质问题&#xff0c;能全面真实揭示细胞多样性和复杂性&#xff0c;能够更加深入地研究细胞类型、细胞功能、细胞亚群及其异质性、细胞谱系等&#xff0c;还常用于识别新的细胞类型…

cesium 指定点旋转rectangle entity方式 坐标篇

cesium中rectangle是水平垂直于正北方向的&#xff0c;rectangle的属性中有rotation&#xff0c;但是rotation是以矩形的中心点进行旋转的&#xff0c;旋转过程中矩形的形状可能会变形&#xff0c;如果需要以矩形的顶点为原点进行旋转&#xff0c;可以采用entity的方式添加poly…

2024年外贸行业营销神器推荐

2024年外贸行业营销神器推荐&#xff1a;外贸人每天面对的不是国内客户&#xff0c;而是全球客户&#xff0c;相对于国内来说&#xff0c;会更加麻烦和繁琐&#xff0c;今天就码一篇2024年外贸行业营销神器的推荐文章&#xff0c;希望可以减轻各位外贸人的负担&#xff01; 1、…

OpenHarmony实战开发-页面深色模式适配。

介绍 本示例介绍在开发应用以适应深色模式时&#xff0c;对于深色和浅色模式的适配方案&#xff0c;采取了多种策略如下&#xff1a; 1. 固定属性适配&#xff1a;对于部分组件的颜色属性&#xff0c;如背景色或字体颜色&#xff0c;若保持不变&#xff0c;可直接设定固定色值…

Matroska解封装原理与实践

本期作者 背景 Matroska是一种开放标准、功能强大的多媒体封装格式&#xff0c;可容纳多种不同类型的视频、音频及字幕流&#xff0c;其常见的文件扩展名为.mkv、.mka等。与应用广泛的MP4相比&#xff0c;Matroska更加灵活开放&#xff0c;可以同时容纳多个字幕&#xff0c;甚至…

C#引用外部组件的常用方法

我们在开发程序过程中&#xff0c;时常会使用到第三方组件&#xff0c;比如一些通信、UI组件等。常用的引用方法有下面几种。 01 NuGet引用 NuGet是.NET的一个包管理平台&#xff0c;很多开源组件会通过NuGet进行管理和发布。比如我们常用的S7NetPlus等。 从NuGet中引用组件…

零基础学Python专栏文章导航站

零基础学Python专栏文章导航站 专栏导读零基础入门篇 专栏导读 本文是零基础学Python的文章导航站。专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇… 为了方便专栏订阅者更方便的阅读专栏文章&#xff0c;点击链接即可跳转到具体文章&#…

FL Studio v21.2.3.4004 中文永久版网盘下载(含Key.reg注册表补丁)

软件介绍 FL Studio21水果编曲软件汉化版是一款专业的音乐制作软件&#xff0c;被广泛地应用于电子音乐、hip-hop、流行乐等多种音乐类型的制作。该软件提供了丰富的音频编曲工具和音乐效果器&#xff0c;让用户可以轻松地创作出高品质的音乐作品。同时&#xff0c;这也是一款…

“我,月薪4500,副业收入2w”:用Python做副业,到底有多赚钱?

现在在年轻人打工的第一目标是什么&#xff1f; 就是&#xff1a;搞钱&#xff01;搞钱&#xff01;搞钱&#xff01; 但赚钱谈何容易&#xff0c;很多人工作只有一点“死”工资&#xff0c;每月再扣除房租水电、花呗信用卡的钱&#xff0c;能用的钱真的不多了&#xff0c;更…

Linux yum搭建Keepalived,2 台机器都有虚拟 IP 问题

文章目录 Keepalived 搭建一、安装二、keepalived配置1、配置文件详解global_defs模块参数vrrp_instance模块参数vrrp_script模块参数 2、修改配置文件3、启动服务 Tips:1️⃣问题&#xff1a;两台机器上面都有VIP的情况2️⃣完整配置文件 Keepalived 搭建 服务IP服务器Keepal…

van-uploader 在app内嵌的webview中的一些坑

问题&#xff1a; 部分版本在ios 中没有问题&#xff0c;但是安卓中不触发图片选择和拍照&#xff08;之前是可以的&#xff0c;可能是没有锁定版本&#xff0c;重新发版导致的&#xff09;。在ios中下拉文案是英文&#xff0c;html配置lang等于 zh 也没有用&#xff0c;ios里…