Python面试宝典第28题:合并区间

news2025/1/10 20:39:08

题目

        以数组 intervals 表示若干个区间的集合,其中单个区间为intervals[i] = [starti, endi],且endi大于starti。请合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

        示例 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] 可被视为重叠区间

分治法

        使用分治法来解决本题的基本思想是:将整个问题划分为更小的子问题,并递归地解决这些子问题,最后将子问题的解合并起来形成最终的解决方案。使用分治法求解本题的主要步骤如下。

        1、排序。首先,对输入的区间按起始位置进行排序。

        2、递归划分。将排序后的区间列表递归地分为两半,直到每个子问题只包含一个或零个区间。

        3、合并区间。在递归返回的过程中,逐步合并相邻的区间。如果两个相邻的区间有重叠部分,则合并它们。如果没有重叠,则直接将它们添加到结果中。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def merge_intervals_by_divide_conquer(intervals):
    if not intervals:
        return []

    # 对区间按起始位置进行排序
    intervals.sort(key=lambda x: x[0])

    # 使用分治策略合并区间
    def merge_intervals(intervals):
        if len(intervals) <= 1:
            return intervals

        mid = len(intervals) // 2
        left_intervals = merge_intervals(intervals[:mid])
        right_intervals = merge_intervals(intervals[mid:])
        return merge_sorted_intervals(left_intervals, right_intervals)

    # 合并两个已排序的区间列表
    def merge_sorted_intervals(left, right):
        merged = []
        i, j = 0, 0
        while i < len(left) and j < len(right):
            if left[i][1] < right[j][0]:
                merged.append(left[i])
                i += 1
            elif right[j][1] < left[i][0]:
                merged.append(right[j])
                j += 1
            else:
                start = min(left[i][0], right[j][0])
                end = max(left[i][1], right[j][1])
                merged.append([start, end])
                i += 1
                j += 1

        # 添加剩余的区间
        while i < len(left):
            merged.append(left[i])
            i += 1
        while j < len(right):
            merged.append(right[j])
            j += 1

        return merged

    # 合并操作
    return merge_intervals(intervals)

intervals = [[1,3], [2,6], [8,10], [15,18]]
print(merge_intervals_by_divide_conquer(intervals))

intervals = [[4,5], [1,4]]
print(merge_intervals_by_divide_conquer(intervals))

排序+遍历法

        使用排序+遍历法解决区间合并问题的基本思想是:先对区间按照起始位置进行排序,然后遍历排序后的区间列表,并在遍历过程中合并重叠的区间。使用排序+遍历法求解本题的主要步骤如下。

        1、排序。首先,对输入的区间按起始位置进行排序。

        2、遍历。从第一个区间开始遍历,检查当前区间是否与前一个区间有重叠部分。如果有重叠,则合并这两个区间。如果没有重叠,则将当前区间添加到结果列表中。

        3、合并。当发现重叠区间时,更新当前区间的结束位置为两个区间结束位置的最大值。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def merge_intervals_by_sort_traversal(intervals):
    if not intervals:
        return []

    # 对区间按起始位置进行排序
    intervals.sort(key=lambda x: x[0])

    merged = []
    for interval in intervals:
        if not merged or merged[-1][1] < interval[0]:
            # 如果结果列表为空,或者当前区间的起始位置大于前一个区间的结束位置
            merged.append(interval)
        else:
            # 更新前一个区间的结束位置为两个区间结束位置的最大值
            merged[-1][1] = max(merged[-1][1], interval[1])

    return merged

intervals = [[1,3], [2,6], [8,10], [15,18]]
print(merge_intervals_by_sort_traversal(intervals))

intervals = [[4,5], [1,4]]
print(merge_intervals_by_sort_traversal(intervals))

总结

        如果需要处理大量的区间,并且希望在处理过程中保持较高的效率,那么分治法可能不是一个最佳的选择。这主要是基于以下几点:一是分治算法涉及递归调用,这会导致额外的函数调用开销,尤其是在递归层数较多的情况下;二是分治算法在递归返回时需要合并子问题的解,这可能涉及到多个区间的比较和合并操作;三是分治算法的实现需要递归逻辑和合并操作,对于初学者来说可能不够直观,调试也相对困难。

        对于此类问题,通常的做法是直接使用排序+遍历的方法。排序+遍历法的时间复杂度主要由排序决定,为O(n*log(n)),其中n是区间的数量。其空间复杂度为O(n),用来存储合并后的区间。排序+遍历法是解决区间合并问题最常用且最有效的方法之一,适用于大多数场景。

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

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

相关文章

Linux 利用 iostat 和 iotop 进行 IO 分析

目录 一、概述二、iostat1、下载2、常用选项3、/proc/diskstats 文件3、一般使用 三、iostop1、下载2、常用选项3、一般使用 一、概述 在Linux 系统上&#xff0c;iostat 和 iotop 这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。 如果 Linux 系统…

关于Redis的集群面试题

问题一&#xff1a;Redis的多数据库机制&#xff0c;了解多少&#xff1f; Redis支持多个数据库&#xff0c;并且每个数据库是隔离的不能共享&#xff0c;单机下的redis可以支持16个数据库&#xff08;db0~db15&#xff09;;若在Redis Cluster集群架构下&#xff0c;则只有一个…

基于STM32F103的FreeRTOS系列(七)·任务创建·列表的使用超详细解析

目录 1. 列表和列表项 1.1 列表和列表项简介 1.1.1 列表 1.1.2 列表项 1.1.3 迷你列表项 1.1.4 列表与列表项关系图 1.2 列表初始化 1.3 列表项的初始化 1.4 列表项的插入函数 1.5 列表项的末尾插入 1.6 列表项的删除 1.7 列表的遍历 1. 列表和列表项…

Open3D 三维重建-Marching Cubes (行进立方体)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1步骤 2.1.2函数代码 2.2完整代码 三、实现效果 3.1原始点云 3.2重建后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#…

基于Flask框架的豆瓣电影实时数据分析可视化系统【自动爬虫、数据库、Pyecharts】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据抓取数据存储可视化前后端交互登陆界面注册界面数据更新后展示每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目基于Py…

JavaEE: 线程安全问题的解决方案(synchronized)

发生原因 要想解决线程安全问题,那么我们首先得知道线程安全问题为什么会发生. 发生原因: 线程在操作系统中是"随机调度,抢占式执行的"[根本原因].多个线程,同时修改同一个变量修改操作不是"原子"的内存可见性问题指令重排序 解决方案 原因1和2,我们很…

基于YOLOv8的茶叶病变检测系统

基于YOLOv8的茶叶病变检测系统 (价格85) 包含 [Algal Leaf Spot, Brown Blight, Gray Blight, Healthy, Helopeltis, Red Leaf Spot] 6个类 翻译&#xff1a; [藻类叶斑病&#xff0c;褐疫病&#xff0c;灰疫病&#xff0c;健康&#xff0c;茶角盲蝽&#xff0c; 红叶斑…

08.SQL注入-下(超详细!!!)

1、Access注入 1.1 判断是否存在注入漏洞 ?id10 and 11 //不报错 ?id10 and 12 //报错1.2 判断字段数 ?id10 order by 1 ... ?id10 order by 7 //不报错 ?id10 order by 8 //报错 说明有7个字段1.3 猜表名 ?id10 and exists(select * from administrator) …

IP协议解析

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

C语言宏定义的使用

文章目录 &#x1f34a;自我介绍&#x1f34a;宏定义&#x1f34a;宏函数&#x1f34a;嵌入式开发常用do...while(0)&#x1f34a;字符串化运算符 ‘ # ’&#x1f34a;不定参数宏 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xf…

SQL报错注入之floor

目录 1.简述 2.关键函数说明 1.rand函数 2.floor&#xff08;rand&#xff08;0&#xff09;*2&#xff09;函数 3.group by 函数 4.count&#xff08;*&#xff09;函数 3.报错分析 4.报错流程 4.1寻找注入点 4.2爆数据库名 4.3爆表名 4.4爆字段名 4.5查询数据 1.…

32、Python之面向对象:对象的表示,再论Python是dict包括语法糖

引言 在前面介绍Python容器的时候&#xff0c;我们曾经用过这种夸张的表述&#xff0c;“Python就是包裹在一堆语法糖中的字典”。虽然夸张&#xff0c;其实更多的是为了突出Python中dict的强大之处。今天这篇文章&#xff0c;打算看下Python中类对象、实例对象的表示及内存管理…

甄选范文“论负载均衡技术在Web系统中的应用”软考高级论文系统架构设计师论文

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术, 可将负载(工作任务) 进行平衡、分摊到多个操作单元上执行, 从而协同完成工作任务, 达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题, 依次从以下三个方面进行论述。 1.…

自动化测试 — selenium + Java

什么是自动化测试 将人为驱动的测试行为转化为机器执行的过程。 自动化测试包括UI 自动化&#xff0c;接口自动化&#xff0c;单元测试自动化。按照这个金字塔模型来进行自动化测试规划&#xff0c;可以产生最佳的自贡话测试产出投入比&#xff08;ROI &#xff09;&#xff0c…

智能氮气柜如何为存储应用提供稳定和安全的环境?

智能氮气柜在保持内部环境的严格控制下&#xff0c;如何为各类高要求的存储应用提供一个稳定和安全的环境&#xff1f; 智能氮气柜内部安装高精度温湿度传感器&#xff0c;持续监测内部环境状况。通过外部连接的氮气供应源&#xff0c;向柜内注入高纯度氮气&#xff0c;当检测到…

k8s—ingress应用

一、ingress和ingress-controller ingress对象&#xff1a; 指的是k8s中的⼀个api对象/资源对象&#xff0c;⼀般⽤yaml配置。作⽤是定义请求如何转发到service的规则&#xff0c;可以理解为配置模板。 ingress-controller&#xff1a; 具体实现反向代理及负载均衡的程序&…

IO-Link通信笔记(十七)——可任意MCU平台移植的面向对象程序设计的IO-Link从站协议栈与接口代码生成和监控上位机与便携式通信主站

一、可任意MCU平台移植的面向对象程序设计的IO-Link从站协议栈 图形化界面与驱动代码库生成功能&#xff0c;是现如今几大半导体芯片供应商选择向广大开发人员推荐的主流开发方式&#xff0c;例如意法的cube-mx。开发人员可以通过这些软件针对所使用芯片的相关外设资源&#xf…

缺失值处理方法:代数/统计/机器学习算法补全数据(附Python-sklearn代码精美可视化绘图)

注&#xff1a;本期的删除或插补方法主要针对连续数据&#xff0c;时间序列数据的插补在后续关于时间序列的博客中讲明。参考鸢尾花丛书&#xff0c;链接如下&#xff1a; 参考书籍及源代码链接https://github.com/Visualize-ML 博客是选出自己感觉用的到的精炼部分加自己的理…

春秋云境 | 文件上传 | CVE-2022-30887

目录 靶标介绍 开启靶场 上传一句话木马 蚁剑连接 找到 flag 靶标介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0…

eclipse无法使用jdk1.6编译老项目

主要修改两个地方的配置&#xff1a; 1、eclipse中配置的maven版本不能过高&#xff0c;亲测3.2.5版本是好使的。 2、修改eclipse安装目录下的eclipse.ini文件&#xff0c;将其中的-Dosgi.requiredJavaVersion更改为1.6即可&#xff0c;我得默认是1.7 最后附上maven安装包&…