算法打卡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:
        # 如果区间集合为空,返回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,说明没有空集合,但是这个为了代码的完整性,改进代码还是补充了判空

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…

AGI的核心对齐问题:能力泛化和急速左转

在解决人工智能对齐&#xff08;alignment&#xff09;的技术挑战时&#xff0c;一个核心问题是确保人工智能系统的行为与人类价值和期望保持一致。 然而&#xff0c;人工智能系统往往在获取更强大的能力时会比在对齐方面更容易实现泛化。换句话说&#xff0c;尽管我们可能能够…

Git 安装和配置

下载 Git 网址: https://git-scm.com/download 安装 Git 双击安装包, 开始安装. 修改安装路径, 选择非中文无空格路径: 开始安装: 安装成功: 配置 Git 安装完成后, 在任意文件夹内, 右键, 可以显示两个 Git 选项, 就说明安装成功了.

数据结构——线性表(链式存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

如何用electron(vue)搜索电脑本地wifi

对于搜索本地 WiFi 网络&#xff0c;可以使用 Electron 结合 Node.js 来编写一个简单的应用程序。 以下是一个基本的示例&#xff0c;它使用 Node.js 的 wifi 模块来搜索并列出附近的 WiFi 网络&#xff1a; 首先&#xff0c;确保你已经安装了 Node.js 和 Electron。 然后&am…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

Learning Feature Sparse Principal Subspace 论文阅读

1 Abstract: 这篇论文提出了新的算法来解决特征稀疏约束的主成分分析问题&#xff08;FSPCA&#xff09;&#xff0c;该问题同时执行特征选择和PCA。现有的FSPCA优化方法需要对数据分布做出假设&#xff0c;并且缺乏全局收敛性的保证。尽管一般的FSPCA问题是NP难问题&#xff…

华为海思数字芯片设计笔试第二套

1.声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨…

Adobe After Effects 2024 v24.3 macOS 视频合成及特效制作软件 兼容 M1/M2/M3

Adobe After Effects 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺的辅助工具,是视频后期合成处理的专业非线性编辑软件。 macOS 12.0及以上版本可用 应用介绍 Adobe After Effects简称 AE 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺…

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理&#xff1a;服务器通过请求登录SMTP邮箱服务器接口&#xff0c;对指定的收件人发送信息。 建议大家使用商业版的邮箱&#xff0c;比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…

智能边缘自动化:HDMI接口钡铼ARM工业电脑实践案例

一款具备HDMI接口的高性能ARM工业计算机应运而生&#xff0c;为实现在工业4.0时代的关键数据实时处理与可视化管理提供了强有力的硬件支撑。这款计算机依托其独特的边缘计算能力&#xff0c;完美解决了工业环境中大规模数据传输至云端的高延迟问题&#xff0c;成功实现了OT&…

内网安全--AS-REP Roasting攻击

AS-REP Roasting是一种对用户账号进行离线爆破的攻击方式。但是该攻击方式利用比较局限&#xff0c;因为其需要用户账户设置“不要求Kerberos预身份验证”选项&#xff0c;而该选项是默认没有勾选上的。Kerberos预身份验证发送在Kerberos身份验证的第一阶段(AS_REQ&AS-REP)…

免费的GPT-3.5 API服务aurora

什么是 aurora &#xff1f; aurora 是利用免登录 ChatGPT Web 提供的无限制免费 GPT-3.5-Turbo API 的服务&#xff0c;支持使用 3.5 的 access 调用。 【注意】&#xff1a;仅 IP 属地支持免登录使用 ChatGPT的才可以使用&#xff08;也可以自定义 Baseurl 来绕过限制&#x…

逐步学习Go-sync.RWMutex(读写锁)-深入理解与实战

概述 在并发编程中&#xff0c;我们经常会遇到多个线程或协程访问共享资源的情况。为了保护这些资源不被同时修改&#xff0c;我们会用到"锁"的概念。 Go中提供了读写锁&#xff1a;sync.RWMutex。 sync.RWMutex是Go语言提供的一个基础同步原语&#xff0c;它是Rea…

3D Matching:实现halcon中的find_surface_model

halcon中的三维匹配大致分为两类&#xff0c;一类是基于形状的(Shape-Based)&#xff0c;一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体&#xff0c;3D物体模型必须是CAD模型&#xff0c;且几何边缘清晰可见&#xff0c;使用的相机也要预…

com.intellij.diagnostic.PluginException 问题

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、 推荐阅读 一、导读 遇到…

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据&#xff08;包括属性、详情图、SKU、价格等&#xff09;可以通过以下几种方式实现&#xff1a; 使用淘宝数据抓取工具&#xff1a;这类工具&#xff0c;如某鱼等&#xff0c;能够自动化采集淘宝商品数据&#xff0c;并将其转换成CSV、Excel等格式&am…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

[react] 受控组件和非受控组件

什么是受控? 就是比如一个文本框,你可以随便输入就是受控,他收到状态的影响 <div className"App" >受控<input value{name}></input><br />非受控<input defaultValue{name}></input></div > 你想强行改?浏览器报错!…

Substance 3D2024版 下载地址及安装教程

Substance 3D是Adobe公司推出的一套全面的3D设计和创作工具集合&#xff0c;用于创建高质量的3D资产、纹理和材质。 Substance 3D包括多个功能强大的软件和服务&#xff0c;如Substance 3D Painter、Substance 3D Designer和Substance 3D Sampler等。这些工具提供了广泛的功能…