3-合并区间

news2024/10/3 4:33:06

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 List
    
    
    class 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 List
    
    
    class 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 List
    
    
    class 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,非空列表被视为True
                if 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 List
    
    
    class 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,非空列表被视为True
                if 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.coloradmin.cn/o/1241094.html

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

相关文章

Redis主从,缓存击穿,雪崩,哨兵等问题

Redis的性能管理&#xff1a; Redis的数据缓存在内存当中 INFO memory used_memory:853808 Redis中数据占用的内存 used_memory_rss:3715072 Redis向操作系统申请的内容 used_memory_peak:853808 Redis使用的内存的峰值 系统巡检&#xff1a;硬件巡检&#xff0c;数据库…

C语言—指针入门

内存存放数据 如果发送指令&#xff0c;读取f变量的内容&#xff0c;则先找f - >10005这个字节&#xff0c;然后再找到123。 指针和指针变量 通常说的指针就是地址的意思&#xff0c;C中有专门的指针变量存放指针。一个指针占4个字节。 定义指针变量 类型名 *指针变量名…

数组的移动

设计程序&#xff0c;给定包含N个整数的数组array&#xff0c;实现操作&#xff1a;前面各个整数顺序向后移动m个位置&#xff0c;最后的m个整数移动到最前面。方法&#xff1a;void move(int array[], int n,int m ) 输入要求 第一行输入两个整数N(1<N<1e6)和m(0<m&…

JavaEE 多线程01

为什么引入多线程? 首先进程已经能很好的完成多任务这个情景下的并发编程了,那为什么又引入多线程呢? 这是因为在一些情景下,我么需要大量的创建和销毁进程来完成一些任务,此时多进程对系统的开销就会很大了. 假设有这样一个场景,服务器同时接收到很多个服务请求,这个时候服务…

MAX/MSP SDK学习06:内存管理

提供两种内存分配方式&#xff1a;①简单指针&#xff0c;②句柄&#xff08;二级指针&#xff09;&#xff1b;官方文档建议使用前者。 // 简单指针 char *ptr; ptr sysmem_newptr(2000); post("I have a pointer %lx and it is %ld bytes in size",ptr, sysmem_p…

算法的奥秘:常见的六种算法(算法导论笔记2)

算法的奥秘&#xff1a;种类、特性及应用详解&#xff08;算法导论笔记1&#xff09; 上期总结算法的种类和大致介绍&#xff0c;这一期主要讲常见的六种算法详解以及演示。 排序算法&#xff1a; 排序算法是一类用于对一组数据元素进行排序的算法。根据不同的排序方式和时间复…

通过python脚本上传远程服务器文件到minio

前言 将文件上传到MinIO对象存储后&#xff0c;MinIO会将文件存储为对象(.meta文件)&#xff0c;并为每个对象生成相应的元数据。元数据是描述对象的属性和信息的数据。 通常&#xff0c;元数据包括对象的名称、大小、创建日期等。 在MinIO中&#xff0c;对象的元数据存储在独立…

递归回溯剪枝-子集

LCR 079. 子集 - 力扣&#xff08;LeetCode&#xff09; 方法一 1. 决策树&#xff1a;对于决策树&#xff0c;思考的角度不同&#xff0c;画出的决策树也会不同&#xff0c;这道题可以从两个角度来画决策树。 2. 考虑全局变量的使用&#xff1a; 使用全局变量 List<List&…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳转&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年开发&#xff0c;是一种工业现场总线协议标准。 Modbus 通信协议具有多个变种&#xff0c;支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的…

智慧城市内涝积水监测仪功能,提升城市预防功能

内涝积水监测仪不仅改变了人们应对城市内涝的老办法&#xff0c;还让智慧城市往前迈了一大步。这个监测仪是怎么做到的呢&#xff1f;就是靠它精准的数据监测和预警&#xff0c;让城市管理有了更科学高效的解决妙招。它就像有了个聪明又负责任的助手&#xff0c;让城市管理更加…

AI虚拟主播系统+智能交互+AI词库+虚拟形象 附带完整的搭建教程

近几年电商直播带货热潮持高不跌&#xff0c;很多商家企业都会选择线上直播卖产品&#xff0c;与此同时&#xff0c;虚拟主播开始盛行&#xff0c;与真人主播相比&#xff0c;品牌虚拟主播无档期风险、离职风险、人设稳定更可控。 AI虚拟主播的不是为了取代真人主播而开发&…

AI:86-基于深度学习的街景图像地理位置识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

mapBox地图第一个案例和聚合图标自定义

Mapbox地图数据平台 1.简介 Mapbox是移动的和Web应用程序的位置数据平台&#xff0c;适用于分层区位分析图&#xff0c;可自定义元素、色彩等&#xff0c;任何图层都可编辑.。Mapbox灵活的地图和位置构建块可以无缝集成到您的数据分析应用程序或数据可视化中。 平滑的矢量地…

Dubbo从入门到上天系列第十八篇:Dubbo引入Zookeeper等注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

文章目录 一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; 2&#xff1a;注册中心关系图解 3&#xff1a;引入注册中心服务执行流程 4&#xff1a;Dubbo注册中心好处 5&#xff1a;注册中心核心作用 二&#xff1a;注册中心实现方案 …

10.docker的网络network-概述

1.docker的网络模式 docker共有四种网路模式&#xff0c;分别是bridge、host、none和container. 1.1 bridge bridge,也称为虚拟网桥。在bridge模式下&#xff0c;为每个容器分配、配置IP等&#xff0c;并将容器连接到一个docker0。使用–network bridge命令指定&#xff0c;…

程序员指南六:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…

【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

文章目录 最终效果前言生成墙壁优化方法一、使用rule tile方法二、使用代码生成墙壁补充最终效果后续参考源码完结最终效果 前言 本期是本项目最后一期,主要是进行墙壁的生成优化和补充一下剩下了的其他内容 生成墙壁优化 方法一、使用rule tile 我这里大概给个rule tile参…

跟着Cancer Cell 学作图| 配对棒棒糖图(Lollipop chart)

dotplot 本期图片 ❝ Doi&#xff1a;https://doi.org/10.1016/j.ccell.2022.02.013 ❞ ❝ Dotplot showing the association of cell populations with different tissue types (organ or tumor). The x axis represents cell types, and the y axis represents the different…

对比两个数组中对应位置的两个元素将每次对比的最大值用于构成新的数组np.maximum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对比两个数组中对应位置的两个元素 将每次对比的最大值用于构成新的数组 np.maximum() 选择题 以下代码的输出结果为&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

webshell之无扩展免杀

1.php加密 这里是利用phpjiami网站进行加密&#xff0c;进而达到加密效果 加密前&#xff1a; 查杀效果 可以看到这里D某和某狗都查杀 里用php加密后效果 查杀效果 可以看到这里只有D某会显示加密脚本&#xff0c;而某狗直接绕过 2.dezend加密 可以看到dezend加密的特征还是…