代码随想录算法训练营第三十六天丨435. 无重叠区间、763. 划分字母区间、56. 合并区间

本文主要是介绍代码随想录算法训练营第三十六天丨435. 无重叠区间、763. 划分字母区间、56. 合并区间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

435. 无重叠区间

我的思路:

跟昨天的第三题很像,按照右边界排序,记录当前非重叠区间的右边界用于检测下个区间起点,由于区间按照右边界有序,非重叠区域右界必定是判断过的最小值;迭代结束即可得到结果。

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort(key=lambda x: x[1])start = intervals[0][1]res = 0for interval in intervals[1:]:if interval[0] < start:res += 1else:start = interval[1]return res

优化思路:

可以只判断一次,记录非重叠区域数量。

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort(key=lambda x: x[1])start = intervals[0][1]count = 1for interval in intervals[1:]:if interval[0] >= start:count +=1start = interval[1]return len(intervals) - count

763. 划分字母区间

我的思路:

遍历一次字符串,记录每个字符最后一次出现的位置。遍历字符串,对于每个字符,更新当前片段的结束位置 end 为当前字符的最后出现位置。如果当前位置达到了 end,说明当前片段结束,记录当前片段的长度,并将 start 更新为 end,表示开始下一个片段。

class Solution:def partitionLabels(self, s: str) -> List[int]:n = len(s)last_pos = collections.defaultdict()for i, char in enumerate(s):last_pos[char] = ires = []i = 0start = 0while i < n:end = last_pos[s[i]] + 1while i < end:if last_pos[s[i]] + 1 > end:end = last_pos[s[i]] + 1i += 1res.append(end - start)start = endreturn res

优化:

代码量有点大,其实可以直接写for循环。

import collectionsclass Solution:def partitionLabels(self, s: str) -> List[int]:n = len(s)last_pos = collections.defaultdict(int)for i, char in enumerate(s):last_pos[char] = ires = []start = 0end = 0for i in range(n):end = max(end, last_pos[s[i]])if i == end:res.append(end - start + 1)start = i + 1return res

可以用数组做哈希,这里不再改写了...

56. 合并区间

我的思路:

ac了,但是思路有点问题,我一开始想的是对右边界排序;改成左边界直接AC了,并没有能想明白。

初始化左边界和右边界为第一个interval。遍历剩下的interval,如果遇到不相交的,把当前的左右边界作为结果记录;如果相交,更新左右边界。

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort()cur_left,cur_right = intervals[0][0], intervals[0][1]res = []for interval in intervals[1:]:if interval[0] > cur_right:res.append([cur_left, cur_right])cur_left, cur_right = interval[0], interval[1]else:cur_left = min(cur_left, interval[0])cur_right = max(cur_right, interval[1])res.append([cur_left, cur_right])return res

仔细研究了一下,还是没能正确理解排序的作用,其实左边界已经有序了,左边界直接加入结果,如果有重叠直接更新右边界就可以了。

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort()res = []for interval in intervals:if not res or interval[0] > res[-1][1]:res.append(interval)else:res[-1][1] = max(res[-1][1], interval[1])return res

这个就是题解方法了!

如果对右边界排序,则需要从后向前遍历,因为右边界有序,从后遍历右边界一定是更大的。

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key=lambda x: x[1])  # 按照右边界排序res = []while intervals:cur_left, cur_right = intervals.pop()while intervals and intervals[-1][1] >= cur_left:cur_left = min(cur_left, intervals[-1][0])intervals.pop()res.append([cur_left, cur_right])return res

这篇关于代码随想录算法训练营第三十六天丨435. 无重叠区间、763. 划分字母区间、56. 合并区间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729837

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放