3-合并区间

1题目描述

在这里插入图片描述

2思路

  1. 在合并区间之前,需要对所有的区间按照区间第一个元素进行排序,这样可以保证已经合并的各个区间之后不会再包含其他区间,或者被其他区间包含;
    1. 首先自己进行一下排序练习,回顾冒泡排序和选择排序,详见3.1使用排序算法对区间进行排序;
  2. 在合并时,核心思想就是:准备一个空的列表,每次合并都取列表中最后一个区间去和当前待加入的区间进行合并;因为区间已经排过序了,所以列表中非最后一个元素与当前待加入的区间肯定是没有重叠的;详见3.2合并区间;

3实现

3.1使用排序算法对区间进行排序

Anchor1

  1. 冒泡排序和选择排序的动态执行过程详见:冒泡排序和选择排序_选择排序和冒泡排序-CSDN博客;

3.1.1冒泡排序

  1. 核心思想:

    1. 两层循环:外层循环控制趟数,内层循环控制每一趟比较的次数;
    2. 两两比较,即时交换
  2. 应用到区间排序上,代码如下:

    from typing import Listclass Solution:def merge1(self, intervals: List[List[int]]) -> List[List[int]]:# 先排序,按照每个区间的左侧数值升序排序,使用冒泡排序# 外层循环控制排序的轮数for i in range(0, len(intervals) - 1):# 内层循环控制每一轮的比较次数for j in range(0, len(intervals) - 1 - i):# 相邻元素两两比较,升序排列if intervals[j][0] > intervals[j + 1][0]:intervals[j], intervals[j + 1] = intervals[j + 1], intervals[j]print("冒泡排序结果:", intervals)
    # 主函数
    if __name__ == '__main__':# intervals = [[1,3],[2,6],[8,10],[15,18]]# intervals = [[1, 3], [8, 10], [15, 18], [2, 6]]intervals = [[1, 3], [16, 10], [15, 18], [2, 6]]solution = Solution()solution.merge1(intervals)# print(result)
    

    在这里插入图片描述

    在这里插入图片描述

3.1.2选择排序

  1. 核心思想:

    1. 两层循环:外层循环控制轮数(或者说固定住然后待比较的数),内层循环控制每一轮比较的次数(或者说控制当前参与比较的数)
    2. 每一轮,固定住某一个数,然后看之后的数是否比这个数大(小),如果是,则更新最大(小)的索引;最后完成交换;
  2. 应用到区间排序上,代码如下:

    from typing import Listclass Solution:def merge2(self, intervals: List[List[int]]) -> List[List[int]]:# 先排序,按照每个区间的左侧数值升序排序,使用选择排序for i in range(0, len(intervals) - 1):min_index = i  # 记录最小值的索引for j in range(i + 1, len(intervals)):if intervals[j][0] < intervals[min_index][0]:min_index = j  # 更新最小值的索引if min_index != i:# 最小值不是当前i索引对应的值,交换intervals[i], intervals[min_index] = intervals[min_index], intervals[i]print("选择排序结果:", intervals)# 主函数
    if __name__ == '__main__':# intervals = [[1,3],[2,6],[8,10],[15,18]]# intervals = [[1, 3], [8, 10], [15, 18], [2, 6]]# intervals = [[1, 3], [2, 10], [15, 18], [2, 6]]intervals = [[1, 3], [2, 5], [15, 18], [2, 6]]solution = Solution()solution.merge2(intervals)# print(result)

    在这里插入图片描述

    在这里插入图片描述

3.2合并区间

Anchor2

  1. 主要思路:准备一个空列表sorted_list,比较前一个区间的右侧数值和当前区间的左侧数值,如果前一个区间的右侧数值小于当前区间的左侧数值,则两个区间不重叠,直接添加进来;否则重叠,需要更新sorted_list中最后一个区间的右侧数值;

  2. 代码如下:

    from typing import Listclass Solution:def merge1(self, intervals: List[List[int]]) -> List[List[int]]:# 先排序,按照每个区间的左侧数值升序排序,使用冒泡排序# 外层循环控制排序的轮数for i in range(0, len(intervals) - 1):# 内层循环控制每一轮的比较次数for j in range(0, len(intervals) - 1 - i):# 相邻元素两两比较,升序排列if intervals[j][0] > intervals[j + 1][0]:intervals[j], intervals[j + 1] = intervals[j + 1], intervals[j]print("冒泡排序结果:", intervals)# 合并区间sorted_list = []for item in intervals:# 空列表被视为False,非空列表被视为Trueif not sorted_list or sorted_list[-1][-1] < item[0]:# 比较前一个区间的右侧数值和当前区间的左侧数值,如果前一个区间的右侧数值小于当前区间的左侧数值,则两个区间不重叠sorted_list.append(item)else:# 重叠则需要更新sorted_list中最后一个区间的右侧数值sorted_list[-1][1] = max(sorted_list[-1][-1], item[1])return sorted_list# 主函数
    if __name__ == '__main__':# intervals = [[1,3],[2,6],[8,10],[15,18]]intervals = [[1, 3], [8, 10], [15, 18], [2, 6]]# intervals = [[1, 3], [2, 10], [15, 18], [2, 6]]# intervals = [[1, 3], [2, 5], [15, 18], [2, 6]]solution = Solution()sorted_list = solution.merge1(intervals)print("合并区间结果:", sorted_list)# solution.merge2(intervals)# print(result)
  3. 在力扣上执行,提示超出时间限制,可见这里使用冒泡排序的时候,两层循环的嵌套增加了算法的复杂度;

3.3排序算法修改

  1. 前面是自己实现了冒泡排序或者选择排序,其实python中的列表有封装好的排序算法
  1. 这里使用封装好的排序算法,即list中封装的sort函数:

    1. 只需执行:intervals.sort(key=lambda x: x[0]);key用于指定一个函数,这个函数会被应用到列表中的每一个元素上,获取用于排序的键;
    2. 关于此函数:

    在这里插入图片描述

  2. 因此,最终的合并区间的算法代码为:

    from typing import Listclass Solution:def merge1(self, intervals: List[List[int]]) -> List[List[int]]:# 先排序,按照每个区间的左侧数值升序排序intervals.sort(key=lambda x: x[0])# 合并区间sorted_list = []for item in intervals:# 空列表被视为False,非空列表被视为Trueif not sorted_list or sorted_list[-1][-1] < item[0]:# 比较前一个区间的右侧数值和当前区间的左侧数值,如果前一个区间的右侧数值小于当前区间的左侧数值,则两个区间不重叠sorted_list.append(item)else:# 重叠则需要更新sorted_list中最后一个区间的右侧数值sorted_list[-1][1] = max(sorted_list[-1][-1], item[1])return sorted_list# 主函数
    if __name__ == '__main__':# intervals = [[1,3],[2,6],[8,10],[15,18]]intervals = [[1, 3], [8, 10], [15, 18], [2, 6]]# intervals = [[1, 3], [2, 10], [15, 18], [2, 6]]# intervals = [[1, 3], [2, 5], [15, 18], [2, 6]]solution = Solution()sorted_list = solution.merge1(intervals)print("合并区间结果:", sorted_list)# solution.merge2(intervals)# print(result)
    
  3. 然后,就不会超出时间限制了:

    在这里插入图片描述

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

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

相关文章

MySql的数据类型和隐式转换

文章目录 一、数据类型1、数值类型1.1、整数类型1.2、浮点1.3、定点DECIMAL 2、时间类型2.1、日期和时间类型占用的存储空间2.2、日期和时间类型表示的范围2.3、日期和时间类型的零值表示 3、文本类型 二、隐式转换参考文章 一、数据类型 1、数值类型 1.1、整数类型 整数名称…

让SOLIDWORKS Composer动画在PPT中随意转换

SOLIDWORKS Composer作为一款易学易用的技术图解软件&#xff0c;非常适合用来给客户展示自己的产品。这里我们教大家如何将Composer文件插入大PPT中&#xff0c;并任意切换文件&#xff0c;用以给客户展示不用的方案和产品。 1.首先大家要安装SOLIDWORKS Composer Player 这个…

怎样通过代理ip提高上网速度

在当今互联网高度发达的时代&#xff0c;我们经常需要使用代理IP来隐藏自己的真实IP地址或提高网络连接速度。然而&#xff0c;有些用户可能会遇到代理IP无法提高网络速度的情况。那么&#xff0c;如何通过代理IP提高上网速度呢&#xff1f;以下是几个技巧&#xff1a; 1.选择…

【C语言】深入解开指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

程序员最奔溃的瞬间

身为程序员哪一个瞬间让你最奔溃&#xff1f; *程序员最奔溃的瞬间&#xff0c; 勇士&#xff1f; or 无知&#xff1f;

斯坦福大学引入FlashFFTConv来优化机器学习中长序列的FFT卷积

斯坦福大学的FlashFFTConv优化了扩展序列的快速傅里叶变换(FFT)卷积。该方法引入Monarch分解&#xff0c;在FLOP和I/O成本之间取得平衡&#xff0c;提高模型质量和效率。并且优于PyTorch和FlashAttention-v2。它可以处理更长的序列&#xff0c;并在人工智能应用程序中打开新的可…

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间&#xff0c;因为不仅要解决多业务系统数据质量标准不一问题&#xff0c;还需要进行大量的公式计算、报表设计与制作。但那是以前&#xff0c;在大数据分析工具强势崛起的当下&#xff0c;这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…

重要的保护: DC电源模块短路保护

重要的保护&#xff1a;BOSHIDA DC电源模块短路保护 DC电源模块是实验室和工业中非常常见的电源&#xff0c;它能够提供稳定的电压和电流输出&#xff0c;以满足各种设备和电路的需求。然而&#xff0c;如果DC电源模块没有短路保护&#xff0c;它可能会对所连接的仪器和设备造…

基于金枪鱼群算法优化概率神经网络PNN的分类预测 - 附代码

基于金枪鱼群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于金枪鱼群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于金枪鱼群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

增量有余、后劲不足,星途汽车10月份销量环比下降3.9%

撰稿|行星 来源|贝多财经 近日&#xff0c;奇瑞集团发布了10月销量月报。报告显示&#xff0c;奇瑞集团于2023年10月销售汽车20.03万辆&#xff0c;同比增长50.8%&#xff0c;单月销量首次突破20万辆&#xff1b;2023年前10个月的累计销量为145.36辆&#xff0c;同比增长41.6…

12 分布式锁加入看门狗

1、看门狗的流程图 2、看门狗的代码实现 /****类说明&#xff1a;Redis的key-value结构*/ public class LockItem {private final String key;private final String value;public LockItem(String key, String value) {this.key key;this.value value;}public String getKey…

哈希表-set、map

当需要判断一个元素是否在集合中时&#xff0c;就使用哈希法 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。 哈希表中关键码就是数组的索引下标&#xff0c;然后通过…