Python算法题集_合并区间

news2024/11/17 17:31:58

本文为Python算法题集之一的代码示例

题目56:合并区间

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

示例 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 <= intervals.length <= 104

  • intervals[i].length == 2

  • 0 <= starti <= endi <= 104


- 问题分析

  1. 本题为求区间数组的合并
  2. 主要的计算为2个,1区间遍历,2区间合成

- 优化思路

  1. 减少循环层次

  2. 增加分支,减少计算集合

  3. 通过题目分析最优解

    1. 区间数组排序后,运算情况会大为简单
  4. 采用内置算法提升计算效率


  • CheckFuncPerf是我写的函数用时和内存占用模块,地址在这里:Python算法题集_检测函数用时和内存占用的模块【自搓】

  1. 标准求解,双层循环,鼻青脸肿但通过,超过5%在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def merge_base(intervals):
        if not intervals:
            return []
        if len(intervals) == 1:
            return intervals
        result = []
        while intervals:
            tmpArea = intervals.pop(0)
            bPop = True
            while bPop:
                iPopCnt = 0
                bPop = False
                for iIdx in range(len(intervals)):
                    if intervals[-iIdx-1+iPopCnt][0] > tmpArea[1]:
                        continue
                    if intervals[-iIdx-1+iPopCnt][1] < tmpArea[0]:
                        continue
                    addArea = intervals.pop(-iIdx-1+iPopCnt)
                    iPopCnt += 1
                    bPop = True
                    tmpArea[0] = min(tmpArea[0], addArea[0])
                    tmpArea[1] = max(tmpArea[1], addArea[1])
            result.append([tmpArea[0], tmpArea[1]])
        return result
    
    intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
    result = cfp.getTimeMemoryStr(merge_base, intervals)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 merge_base 的运行时间为 1.00 ms;内存使用量为 4.00 KB 执行结果 = [[1, 6], [8, 10], [15, 18]]
    
  2. 标准求解,区间数组排序,单层循环,超过85%在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def merge_ext1(intervals):
        if not intervals:
            return []
        if len(intervals) == 1:
            return intervals
        intervals.sort(key=lambda item: (item[0], item[1]))
        result = []
        tmpleft, tmpright = intervals[0][0], intervals[0][1]
        for index in range(1, len(intervals)):
            newleft, newright = intervals[index]
            if newleft > tmpright:
                result.append([tmpleft, tmpright])
                tmpleft = newleft
                tmpright = newright
            elif newright > tmpright:
                tmpright = newright
        result.append([tmpleft, tmpright])
        return result
    
    intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
    result = cfp.getTimeMemoryStr(merge_ext1, intervals)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 merge_ext1 的运行时间为 0.00 ms;内存使用量为 0.00 KB 执行结果 = [[1, 6], [8, 10], [15, 18]]
    
  3. 标准求解,单层循环,神之一刀,超越97%在这里插入图片描述

比较再赋值改为单次max计算

import CheckFuncPerf as cfp

def merge_ext2(intervals):
    if not intervals:
        return []
    if len(intervals) == 1:
        return intervals
    intervals.sort(key=lambda item: (item[0]))
    result = []
    tmpleft, tmpright = intervals[0][0], intervals[0][1]
    for index in range(1, len(intervals)):
        newleft, newright = intervals[index]
        if newleft > tmpright:
            result.append([tmpleft, tmpright])
            tmpleft = newleft
            tmpright = newright
        else:
            tmpright = max(tmpright, newright)
    result.append([tmpleft, tmpright])
    return result

intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
result = cfp.getTimeMemoryStr(merge_ext2, intervals)
print(result['msg'], '执行结果 = {}'.format(result['result']))

# 运行结果
函数 merge_ext2 的运行时间为 1.00 ms;内存使用量为 4.00 KB 执行结果 = [[1, 6], [8, 10], [15, 18]]
  1. 探索第三方排序,失败 采用numpy排序,不作不死,超过6%, 内存也爆在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def merge_ext3(intervals):
        if not intervals:
            return []
        if len(intervals) == 1:
            return intervals
        import numpy as np
        arr = np.array(intervals)
        tmplist = np.sort(arr, 0).tolist()
        result = []
        tmpleft, tmpright = tmplist[0][0], tmplist[0][1]
        for index in range(1, len(tmplist)):
            newleft, newright = tmplist[index]
            if newleft > tmpright:
                result.append([tmpleft, tmpright])
                tmpleft = newleft
                tmpright = newright
            elif newright > tmpright:
                tmpright = newright
        result.append([tmpleft, tmpright])
        return result
    
    intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
    result = cfp.getTimeMemoryStr(merge_ext3, intervals)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 merge_ext3 的运行时间为 116.01 ms;内存使用量为 14944.00 KB 执行结果 = [[1, 6], [8, 10], [15, 18]]
    

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

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

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

相关文章

CANoe实际项目中文件夹的规划

本人&#xff0c;之前设计了一个CANoe工程&#xff0c;由于工程设计之初没有设计好文档的归纳分类&#xff0c;导致文件查找起来非常费劲。 为了避免以后出现文件混乱&#xff0c;不可查找的问题&#xff0c;故特此归纳说明。 建立工程时&#xff1a; 第1步就应该设计好文档…

品牌定位传播之道:公关、广告与定位原则的结合

​在当今商业环境中&#xff0c;品牌传播的重要性日益凸显。一个成功的品牌传播策略不仅能提升品牌知名度和美誉度&#xff0c;还能在消费者心智中建立稳固的地位。本文将深入探讨公关、广告和定位原则在品牌传播中的作用&#xff0c;以及迅腾文化如何助力品牌传播价值。 一、…

miniReact<一>

一、工程化配置 1.1 目录结构 1.1.1 Multi-repo VS Mono-repo Multi-repo 每个库有自己独立的仓库&#xff0c;逻辑清晰&#xff0c;协同管理复杂 Mono-repo 很方便管理不同独立的库的生命周期&#xff0c;会有更高的操作复杂度 项目有很多包&#xff0c;同时管理多个不同的…

iOS开发Xcode中的ld64和-ld_classic是什么意思

在iOS应用程序开发中&#xff0c;Xcode是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;而链接器是构建应用程序的关键组成部分之一。在Xcode中&#xff0c;我们常常会遇到两个重要的概念&#xff1a;ld64和-ld_classic。它们分别代表了默认链接器和经典链…

Shell脚本之 -------------免交互操作

一、Here Document 1.Here Document概述 Here Document 使用I/O重定向的方式将命令列表提供给交互式程序 Here Document 是标准输 入的一种替代品&#xff0c;可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地 生产出一个文件并用作命令的标准…

JVM篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、对象分配规则三、描述一下JVM加载class文件的原理机制?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…

springboot综合案例(一)

文章目录 前言项目开发流程需求分析库表设计编码环节环境搭建mybatis的配置jsp模版引擎的配置日志的配置基本项目工程的配置 功能实现用户注册实现验证码功能实现用户注册 用户登录功能员工列表实现员工信息增删查改员工增加信息员工修改信息删除员工信息 前言 我具体用一个小…

InputNumber数字输入框(antd-design组件库)简单使用

1.InputNumber数字输入框 通过鼠标或键盘&#xff0c;输入范围内的数值。 2.何时使用 当需要获取标准数值时。 组件代码来自&#xff1a; 数字输入框 InputNumber - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-demo:hello-world react项目antd组件-demo:hello…

震动传感器详解

当涉及到物体的震动检测和感应时&#xff0c;震动模块成为一种常见且实用的工具。这种小巧而功能强大的设备可以用于各种应用&#xff0c;从智能家居到安防系统&#xff0c;再到工业自动化等领域。通过感知和转换物体震动为电信号&#xff0c;震动模块在许多方面都发挥着重要的…

chromedriver安装和环境变量配置

chromedriver 1、安装2、【重点】环境变量配置&#xff08;1&#xff09;包的复制&#xff1a;&#xff08;2&#xff09;系统环境变量配置 3、验证 1、安装 网上随便搜一篇chromedriver的安装文档即可。这里是一个快速链接 特别提醒&#xff1a;截止2024.1.30&#xff0c;chr…

Springboot+vue的健身房管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的健身房管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的健身房管理系统&#xff0c;采用M&#xff08;model&#xf…

老师和老师的区别在哪里

“老师和老师的区别在哪里&#xff1f;”这真是个好问题。有时我会想&#xff0c;是不是因为自己多读了几本书&#xff0c;或者多经历了一些世事&#xff0c;就能更好地胜任教育工作。但实际上&#xff0c;老师和老师的区别&#xff0c;并不仅仅在于经验和知识&#xff0c;更在…

语言革命:NLP与GPT-3.5如何改变我们的世界

文章目录 &#x1f4d1;前言一、技术进步与应用场景1.1 技术进步1.2 应用场景 二、挑战与前景三、伦理和社会影响四、实践经验五、总结与展望 &#x1f4d1;前言 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能领域的一个重要分支…

【Linux】线程池的简易实现(懒汉模式)

文章目录 前言一、懒汉方式1.普通模式1.线程安全模式 二、源代码1.Task.hpp(要执行的任务)2.ThreadPool.hpp(线程池)3.Main.cpp 前言 线程池: 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监…

生产问题排查系列——redis告警连接异常问题排查

项目背景 我们的项目使用redis的场景主要是有两种&#xff0c;一是使用redis缓存各种业务信息&#xff0c;二是使用redis做分布式锁。主要是引用了两个框架jedis和redisson。 Jedis是Redis的Java实现的客户端&#xff0c;其API提供了比较全面的Redis命令的支持&#xff1b; …

【linux】文本处理命令-grep、awk、sed使用(1)

作用&#xff1a; grep数据查找定位awk数据切片sed数据修改 类比SQL&#xff1a; grepselect *from tableawkselect field from tablesedupdate table set fieldnew where fieldold 一、grep 1.1 grep* Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟g…

房屋租赁系统-java

思维导图&#xff1a;业务逻辑 类的存放&#xff1a; 工具类 Utility package study.houserent.util; import java.util.*; /***/ public class Utility {//静态属性。。。private static Scanner scanner new Scanner(System.in);/*** 功能&#xff1a;读取键盘输入的一个菜单…

STM32 RTC中断处理和低功耗模式优化技巧

在基于STM32的RTC应用中&#xff0c;中断处理和低功耗模式优化是非常重要的&#xff0c;可以提高系统的效率和节能。下面&#xff0c;我将介绍STM32 RTC中断处理和低功耗模式优化的技巧。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关…

【蓝桥杯冲冲冲】进阶搜索 Anya and Cubes

蓝桥杯备赛 | 洛谷做题打卡day22 文章目录 蓝桥杯备赛 | 洛谷做题打卡day22Anya and Cubes题面翻译输入格式输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示题解代码我的一些话 Anya and Cubes …

yolov8训练自己的关键点检测模型

参考&#xff1a; https://blog.csdn.net/weixin_38807927/article/details/135036450 标注数据集 安装labelme pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple如果报错 $ labelme 2024-01-31 03:16:20,636 [INFO ] __init__:get_config:67- Loading …