代码随想录算法训练营Day35 | 435. 无重叠区间、763.划分字母区间、56. 合并区间 | Python | 个人记录向

本文目录

  • 435. 无重叠区间
    • 做题
    • 基于左边界的贪心算法
    • 基于左边界,把452.用最少数量的箭引爆气球代码稍做修改
  • 763.划分字母区间
    • 做题
    • 看文章
  • 56. 合并区间
    • 做题
    • 看文章
  • 以往忽略的知识点小结
  • 个人体会

435. 无重叠区间

代码随想录:435. 无重叠区间
Leetcode:435. 无重叠区间

做题

无思路。

基于左边界的贪心算法

有点难理解,需要仔细琢磨。

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if not intervals:return 0intervals.sort(key=lambda x: x[0])  # 按照左边界升序排序count = 0  # 记录重叠区间数量for i in range(1, len(intervals)):if intervals[i][0] < intervals[i - 1][1]:  # 存在重叠区间intervals[i][1] = min(intervals[i - 1][1], intervals[i][1])  # 更新重叠区间的右边界count += 1return count

时间复杂度:O(nlog n) ,有一个快排
空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间

基于左边界,把452.用最少数量的箭引爆气球代码稍做修改

会452题的话,这样看比较好理解。

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if not intervals:return 0intervals.sort(key=lambda x: x[0])  # 按照左边界升序排序result = 1  # 不重叠区间数量,初始化为1,因为至少有一个不重叠的区间for i in range(1, len(intervals)):if intervals[i][0] >= intervals[i - 1][1]:  # 没有重叠result += 1else:  # 重叠情况intervals[i][1] = min(intervals[i - 1][1], intervals[i][1])  # 更新重叠区间的右边界return len(intervals) - result

763.划分字母区间

代码随想录:763.划分字母区间
Leetcode:763.划分字母区间

做题

思路:先遍历一遍,保存各字母的频次;再遍历一次,实时记录当前各字母的频次,当各字母频次均达上限时,才能跳入下一个字母区间。

看文章

可以分为如下两步:

  1. 统计每一个字符最后出现的位置
  2. 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

自己动手实现一下:

class Solution:def partitionLabels(self, s: str) -> List[int]:pos_right = [0] * 26for i in range(len(s)):cur = ord(s[i]) - ord('a')pos_right[cur] = max(i, pos_right[cur])right = 0res = []count = 0for i in range(len(s)):cur = ord(s[i]) - ord('a')right = max(right, pos_right[cur])count += 1if i == right:res.append(count)count = 0right = i+1return res

上述是用数组储存,也可以用hash表存储。具体如下:

class Solution:def partitionLabels(self, s: str) -> List[int]:last_occurrence = {}  # 存储每个字符最后出现的位置for i, ch in enumerate(s):last_occurrence[ch] = iresult = []start = 0end = 0for i, ch in enumerate(s):end = max(end, last_occurrence[ch])  # 找到当前字符出现的最远位置if i == end:  # 如果当前位置是最远位置,表示可以分割出一个区间result.append(end - start + 1)start = i + 1return result

时间复杂度:O(n)
空间复杂度:O(1),使用的hash数组是固定大小

56. 合并区间

代码随想录:56. 合并区间
Leetcode:56. 合并区间

做题

有点类似射箭,排序后,对重叠的区间求并集即可。

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key=lambda x:x[0])left = intervals[0][0]right = intervals[0][1]res = []for i in range(1, len(intervals)):if intervals[i][0] <= right and intervals[i][1] >= left:left = min(intervals[i][0], left)right = max(intervals[i][1], right)else:res.append([left, right])left = intervals[i][0]right = intervals[i][1]res.append([left, right])return res

时间复杂度: O(nlogn)
空间复杂度: O(logn),排序需要的空间开销

看文章

思路大体一致,处理细节有不同,代码如下:

class Solution:def merge(self, intervals):result = []if len(intervals) == 0:return result  # 区间集合为空直接返回intervals.sort(key=lambda x: x[0])  # 按照区间的左边界进行排序result.append(intervals[0])  # 第一个区间可以直接放入结果集中for i in range(1, len(intervals)):if result[-1][1] >= intervals[i][0]:  # 发现重叠区间# 合并区间,只需要更新结果集最后一个区间的右边界,因为根据排序,左边界已经是最小的result[-1][1] = max(result[-1][1], intervals[i][1])else:result.append(intervals[i])  # 区间不重叠return result

以往忽略的知识点小结

  • 找重叠/不重叠区间,主要是对比当前区间的左边界和上一个区间(可能是变化后)的右边界
  • 划分字母区间:可以用最远字母的index,不需要用频次

个人体会

完成时间:1h20min。
心得:区间的题主要是理解判断思路。

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

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

相关文章

三生随记——耳机里的诅咒

深夜&#xff0c;城市的灯火已经渐渐熄灭&#xff0c;只剩下一轮明月孤独地悬挂在天空中&#xff0c;洒下银白色的光芒。在这样一个寂静的夜晚&#xff0c;李浩独自一人坐在昏暗的房间里&#xff0c;耳机紧紧贴在耳边&#xff0c;他正在观看一部知名的恐怖电影。 电影里的恐怖情…

java对象互换工具类

1:将Object类型转成json字符串 /*** 将对象转为字符串* param obj* return*/public static String toString(Object obj) {if(obj null) {return null;}if ("".equals(obj.toString())) {return null;}if (obj instanceof String) {return obj.toString();}try {Ob…

Spring Cloud Gateway 11种断言工厂

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Spring Cloud Gateway路由匹配是Spring WebFlux基础功能的一部分,在Spri…

js将html网页转换成PDF并解决了图表文字被切割的问题

给页面内所有要转换成PDF的HTML元素添加一个class“toPDF” 输出的时候&#xff0c; 遍历所有class"toPDF"的HTML元素 将它们逐个加入到pdf文档中&#xff0c;添加的时候如果超出的则添加一页 一、安装 npm install --save html2canvas npm i jspdf --save二、html…

ruoyi-vue-pro 使用记录(2)

ruoyi-vue-pro 使用记录&#xff08;2&#xff09; 数据库商城商品模块数据表营销数据库交易数据库统计数据库 数据库 商城 参考官方文档 ruoyi-vue-pro yudao 项目商城 mall 模块启用及相关SQL脚本 商品模块&#xff08;中心&#xff09;以 product_ 作为前缀的表交易模块…

Acwing2024蓝桥杯并查集

并查集模板 int n,dad[N],sizee[N];//sizee数组规定只有祖宗结点是有效值 //初始化所有集合 void Init(){for(int i1;i<n;i){dad[i]i;sizee[i]1;}return ; } //查找a的祖宗节点 int Find(int a){if(dad[a]!a) dad[a]Find(dad[a]);//每个集合中只有祖宗节点的值等于自身的值…

你认识edge吗,edge是做什么的

简介 Microsoft Edge&#xff08;研发代号为Project Spartan&#xff0c;又译作微软边缘浏览器&#xff0c;Edge浏览器&#xff09;是一个由微软研发的基于Chromium开源项目及其他开源软件的网页浏览器&#xff0c;于2015年1月21日公布&#xff0c;2015年3月30日公开发布第一个…

pyqt曲线轨迹运动

pyqt曲线轨迹运动 pyqt QPropertyAnimation介绍曲线轨迹运动代码 pyqt QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c…

闭散列哈希表

一、什么是 哈希 &#xff1f; 1.1 哈希概念 与 哈希冲突 在正式介绍闭散列哈希之前&#xff0c;我们需要明确 哈希 的概念。 哈希 &#xff1a;构造一种数据存储结构&#xff0c;通过函数 HashFunc() &#xff0c;使 元素的存储位置 与 其对应的键值 建立一一映射关系&…

国产开源物联网操作系统

软件介绍 RT-Thread是一个开源、中立、社区化发展的物联网操作系统&#xff0c;采用C语言编写&#xff0c;具有易移植的特性。该项目提供完整版和Nano版以满足不同设备的资源需求。 功能特点 1.内核层 RT-Thread内核包括多线程调度、信号量、邮箱、消息队列、内存管理、定时器…

JVM基础之垃圾回收

垃圾回收 1. Base 内存泄漏&#xff1a;不再使用的对象在系统中未被回收 内存溢出&#xff1a;内存泄漏的积累 手动触发垃圾回收&#xff1a;System.gc(),该方法不一定会立即回收垃圾&#xff0c;仅仅是向JVM发送一个垃圾回收请求&#xff0c;具体是否需要垃圾回收由JVM自行…

项目ElasticSearch 6.8 安装配置

配置文件位置: 程序配置文件&#xff1a;/etc/elasticsearch/elasticsearch.ymljvm配置文件&#xff1a;/etc/elasticsearch/jvm.options 1. 确认基础环境 确认主机limit相关参数 grep vm.max_map_count /etc/sysctl.conf && sed -i "svm.max_map_count.*vm.m…

使用php和redis实现分布式锁

实现分布式锁是在分布式环境中确保资源独占性的重要手段。在这里&#xff0c;我将使用 PHP 和 Redis 来展示如何实现基于 Redis 的分布式锁。 首先&#xff0c;我们需要使用 Redis 的 SET 指令来尝试获取锁&#xff0c;并设置一个过期时间&#xff0c;确保锁不会永久存在。在 …

怎么找回回收站里删除的XLS文件?5个恢复方法

我们经常会使用到XLS文件来存储和整理数据。然而有时候由于误操作或不小心&#xff0c;我们可能会将重要的XLS文件删除&#xff0c;并且这些文件可能还被清空出了回收站。面对这种情况许多人会感到焦虑和无助。但是不必过于担心&#xff0c;因为有专门的软件可以帮助我们找回这…

(Java)心得:LeetCode——5.最长回文子串

一、原题 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba"…

神经网络的偏见

神经网络的偏见 前言 神经网络是人工智能和深度学习的核心技术之一&#xff0c;当前的各种大模型和人工智能程序都使用了神经网络技术。 对人类来说&#xff0c;神经网络能根据人类输入的大量数据&#xff0c;实现人类训练模型的目的。但是&#xff0c;神经网络对人类来说是…

【Linux】什么是进程?

一个正在执行的程序&#xff0c;我们称之为进程。 然后我们来顺着一条线来思考。 操作系统底层是用C语言编写的&#xff0c;而我们的进程&#xff0c;它会有各种属性&#xff0c;那么各种属性就可以用一个结构体来对进程的各个属性进行描述&#xff0c;然后这个结构体里面&…

手写一个SPI FLASH 读写擦除控制器(未完)

文章目录 flash读写数据的特点1. 扇擦除SE&#xff08;Sector Erase&#xff09;1.1 flash_se 模块设计1.1.1 信号连接示意图&#xff1a;1.1.2 SE状态机1.1.3 波形图设计&#xff1a;1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图&#xff1a;…

Soviet Kitchen

苏联厨房-具有道具和带有碰撞器的模块化建筑部件的游戏环境资产 内部资产包: 网格-253 前言-98 材料-26 纹理-116 网格格式-(FBX) 纹理格式-(PNG) 资产列表: _BigShelf 多边形计数-1986 文本大小-2048x2048 可以 多边形计数-277 结构尺寸-512x512 _Celling 多边形计数-1 …

Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King 题面翻译 【题目描述】 佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格&#xff0c;呈 8 8 8\times8 88正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行&#xff…