算法打卡day31

news2025/6/25 14:55:35

今日任务:

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:
        # 如果区间集合为空,返回0
        if not intervals:
            return 0

        intervals.sort(key=lambda x: x[0])

        # 初始化移除区间的数量为0
        remove_count = 0
        # 初始化上一个不重叠区间的结束位置为第一个区间的结束位置
        end = intervals[0][1]
        for i in intervals[1:]:
            # 存在重叠区间
            if i[0] < end:
                # 更新重叠区间的右边界:选一个结束位置小的区间,减少重叠
                end = min(i[1],end)
                remove_count += 1
            else:
                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] = i

        result = []  # 存储结果的列表
        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.coloradmin.cn/o/1584268.html

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

相关文章

sqoop:错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster(已解决)

1 报错信息 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster 说明&#xff1a; 操作将数据库中的数据导入到HDFS中 执行sqoop import --connect jdbc:mysql://aaa01:3306/mysql --username root --password root --table test 时报了以下错误 2 报…

【MIT6.S081】Lab1: Xv6 and Unix utilities(详细解答版)

实验内容网址&#xff1a;https://xv6.dgs.zone/labs/requirements/lab1.html Sleep 关键点&#xff1a;函数参数判断、系统函数调用 思路&#xff1a; 通过argc来判断函数参数是否正确&#xff0c;通过atoi函数来讲字符串转化为整型&#xff0c;调用sleep函数后退出程序。 代…

Harmony鸿蒙南向驱动开发-MIPI DSI

功能简介 DSI&#xff08;Display Serial Interface&#xff09;是由移动行业处理器接口联盟&#xff08;Mobile Industry Processor Interface (MIPI) Alliance&#xff09;制定的规范&#xff0c;旨在降低移动设备中显示控制器的成本。它以串行的方式发送像素数据或指令给外…

5.2 配置静态路由

5.2.1 实验1&#xff1a;配置IPv4静态路由 1、实验目的 通过本实验可以掌握&#xff1a; 配置带下一跳地址的IPv4静态路由的方法。配置带送出接口的IPv4静态路由的方法。配置总结IPv4静态路由的方法。配置浮动IPv4静态路由的方法。代理 ARP的作用。路由表的含义。扩展ping命…

铸造大型基础平板的结构应该怎样设计

设计大型基础平板的结构时&#xff0c;需要考虑以下几个方面&#xff1a; 地质条件&#xff1a;首先要了解工程所在地的地质条件&#xff0c;包括土质、地下水位、地震状况等。根据地质条件来选择合适的基础类型&#xff0c;如浅基、深基或地下连续墙等。 荷载分析&#xff1a…

使用docker制作Android镜像(实操可用)

一、安装包准备 1、准备jdk 下载地址&#xff1a;Java Downloads | Oracle 注意版本&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我下载的jdk17&#xff0c;不然后面构建镜像报错&#xff0c;就是版本不对 2、准备安装的工具包 ttps://dev…

大话设计模式之迭代器模式

迭代器模式是一种行为设计模式&#xff0c;它允许客户端逐个访问集合中的元素&#xff0c;而不暴露集合的底层表示。这种模式提供了一种方法来访问聚合对象中的各个元素&#xff0c;而不需要暴露其内部结构。 迭代器模式由以下几个关键角色组成&#xff1a; 迭代器&#xff08…

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台&#xff0c;具有多个下行通信接口及一个或者多个上行网络接口&#xff0c;用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后&#xff0c;实时上传主站系统&#xff0c;完成遥信、遥测等能源数据…

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来&#xff0c;是因为这个网页这里是实时渲染的&#xff0c;我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …

6.1Python之字典的初识

【1】字典的创建与价值 字典&#xff08;Dictionary&#xff09;是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中&#xff0c;键&#xff08;Key&#xff09;必须是唯一的&#xff0c;而值&#xff08;Value&#xff09;则可以是任意类型的数据。…

springboot+vue全栈开发【1.准备工作篇】

目录 前言环境配置关于Maven 前言 为了坚持每天写博客所以开了这个系列~~ 环境配置 1.配置java环境&#xff0c;下载jdk&#xff0c;配置环境变量 这一步有很多教程&#xff0c;不赘述了 2.安装idea 关于Maven Maven是一个项目管理工具&#xff0c;可以对java项目进行自动化…

Vue实现防篡改水印的效果。删除元素无效!更改元素属性无效!支持图片、元素、视频等等。

1、演示 2、水印的目的 版权保护&#xff1a;水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息&#xff0c;以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时&#xff0c;可以追溯到原始作者或版权所有者&#xff0c;从而加强版权保护。 身份识…

AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 &#x1f4f…

特征融合篇 | YOLOv8改进之将Neck网络更换为多级特征融合金字塔HS-FPN | 助力小目标检测

前言:Hello大家好,我是小哥谈。HS-FPN(Hierarchical Scale Feature Pyramid Network)是一种用于目标检测任务的网络结构。它是在传统的Feature Pyramid Network(FPN)基础上进行改进的。HS-FPN的主要目标是解决目标检测中存在的多尺度问题。在传统的FPN中,通过在不同层级…

CNN-Transformer时间序列预测

部分代码&#xff1a; # CNN-Transformer class CNNTransformerEncoder(nn.Module):def __init__(self, input_features, transformer_encoder_heads,embedding_features, cnn_kernel_size, dim_feedforward_enc, n_encoder_layer):super(CNNTransformerEncoder, self).__init…

大语言模型:红蓝对抗的工作原理及作用

您是否对强大的生成式AI领域心生好奇&#xff0c;却又担心随之而来的潜在漏洞&#xff1f;您只需了解红蓝对抗就好了&#xff0c;它也称为破解或提示注入。AI开发的这一关键环节往往被忽视&#xff0c;但其在提高生成式AI模型的性能方面发挥的作用却至关重要。 大语言模型&…

JavaScript进阶6之函数式编程与ES6ESNext规范

函数式编程 柯里化currycurrycompose示例&#xff1a;简化版展开写&#xff1a; debug示例一&#xff1a;示例二&#xff1a; 模板字符串css in js方案 箭头函数问题 生成器 generator应用场景 反射 Reflect 柯里化curry compose是curry的应用 在 lodash/fp underscore ramba …

vue2创建项目的两种方式,配置路由vue-router,引入element-ui

提示&#xff1a;vue2依赖node版本8.0以上 文章目录 前言一、创建项目基于vue-cli二、创建项目基于vue/cli三、对吧两种创建方式四、安装Element ui并引入五、配置路由跳转四、效果五、参考文档总结 前言 使用vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创…

JVM虚拟机(二)类加载器、双亲委派模型、类装载的执行过程

目录 一、类加载器1.1 什么是类加载器&#xff1f;1.2 类加载器的分类 二、双亲委派模型2.1 什么是双亲委派模型&#xff1f;1&#xff09; 示例一&#xff1a;加载自己创建的类2&#xff09;示例二&#xff1a;加载JDK原有的类 2.2 JVM 为什么采用双亲委派模型&#xff1f; 三…

3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物

在数据分析过程中&#xff0c;经常需要从一个数据推到另外一个数据&#xff0c;日期数据也是如此&#xff0c;需要从一个日期推到另外一个相关的日期&#xff0c;或者从一群日期推到另外一个相关的日期/一群相关的日期。这一期说的就是日期之间彼此推衍的函数&#xff0c;会比之…