Python算法题集_合并区间

本文为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 ~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 1.两数之和(C++)DAY1(待补充哈希表法)

文章目录 1.题目描述示例提示 2.解答思路3.实现代码结果4.总结 1.题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&…

假期2.3

第二章 引用内联重载 一&#xff0e;选择题-* 1、适宜采用inline定义函数情况是&#xff08;C&#xff09; A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A …

Datawhale组队学习 Task10 环境影响

第12章 环境影响 在本章中&#xff0c;首先提出一个问题&#xff1a;大语言模型对环境的影响是什么&#xff1f; 这里给出的一个答案是&#xff1a;气候变化 一方面&#xff0c;我们都听说过气候变化的严重影响(文章1、文章2)&#xff1a; 我们已经比工业革命前的水平高出1.…

LeetCode热题HOT100【栈的压入、弹出序列】

&#x1f525;LeetCode热题HOT100【栈的压入、弹出序列】 1. 题目来源2.题目 1. 题目来源 来自LeetCode热题HOT100 https://leetcode.cn/studyplan/top-100-liked/?isDarktrue 2.题目 题目地址 Leetcode地址 3.Stack 在Java中&#xff0c;Stack 是一个基于后进先出&#…

玩美移动为花西子海外官网打造AR虚拟试妆决方案

全球领先的增强现实&#xff08;AR&#xff09;及人工智能&#xff08;AI&#xff09;美妆科技领导者及玩美系列APP开发商——玩美移动&#xff08;纽交所代码&#xff1a;PERF&#xff09;于近日宣布携手知名美妆品牌花西子&#xff0c;在其线海外官方网页提供多项彩妆虚拟试妆…

TanDEM-X30米DEM数据介绍

一、背景 之前介绍了Copernicus 30米DEM以及Alos 30米DEM数据的详细介绍以及接入到Cesium中的效果展示&#xff0c;有遥感专业工作者对比了Copernnicus、ALOA、ASTER、NASA、SRTM这几家30米DEM数据&#xff0c;得出了Copernicus 30米DEM数据是最好的全球级30米DEM数据&#xf…

Java8 中文指南(一)

Java8 中文指南&#xff08;一&#xff09; 文章目录 Java8 中文指南&#xff08;一&#xff09;《Java8 指南》中文翻译接口的默认方法(Default Methods for Interfaces)Lambda 表达式(Lambda expressions)函数式接口(Functional Interfaces)方法和构造函数引用(Method and Co…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

QT 应用中集成 Sentry

QT 应用中集成 Sentry QT应用中集成 SentrySentry SDK for C/C注册 Sentry 账号QT 应用中集成 Sentry触发 Crash 上报 QT应用中集成 Sentry Sentry 是一个开源的错误监控和日志记录平台&#xff0c;旨在帮助开发团队实时捕获、跟踪和解决软件应用程序中的错误和异常。它提供了…

Python flask 表单详解

文章目录 1 概述1.1 request 对象 2 示例2.1 目录结构2.2 student.html2.3 result.html2.4 app.py 1 概述 1.1 request 对象 作用&#xff1a;来自客户端网页的数据作为全局请求对象发送到服务器request 对象的重要属性如下&#xff1a; 属性解释form字典对象&#xff0c;包…

如何批量获取当前文件夹下的文件名

最近&#xff0c;在和网友交流时&#xff0c;对方推荐了一个视频&#xff0c;我打开一看&#xff0c;是一个手工获取当前目录下所有文件名的手机视频。用的方法是在win11中复制所有文件的路径&#xff0c;然后粘贴到Excel当中&#xff0c;通过查找替换和分列的方法&#xff0c;…

EasyX图形库学习(二)

目录 一、文字绘制函数 settextstyle 设置当前文字样式。 outtextxy 在指定位置输出字符串。 ​编辑 但如果直接使用,可能有以下报错&#xff1a; 三种解决方案&#xff1a; 将一个int类型的分数,输出到图形界面上 如果直接使用&#xff1a; 会把score输入进去根据A…

被人疯狂吐槽的预制菜,居然是资本看重的“万亿级”市场?

被人疯狂吐槽的预制菜&#xff0c;居然是资本看重的“万亿级”市场&#xff1f; 文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 大家是不是以为只有被天天吐槽难吃的外卖和小饭店&#xff0c;才会用预制菜&#xff0c;…

#从零开始# 在深度学习环境中,如何用 pycharm配置使用 pipenv 虚拟环境

为Python项目创建虚拟环境 在深度学习环境和一般python环境中安装pipenv基本一致&#xff0c;只需要确认好pipenv指定的python版本即可,安装pipenv前&#xff0c;可以通过python --version来确认安装版本 快捷键&#xff1a;crtl alt S 查看interpreter&#xff0c;查看所有…

代码随想录算法训练营第42天 | 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

目录 01背包问题&#xff0c;你该了解这些&#xff01; 01 背包 二维dp数组01背包 &#x1f4bb;实现代码 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 一维dp数组&#xff08;滚动数组&#xff09; &#x1f4bb;实现代码 416. 分割等和子集 &#x1f…

《Numpy 简易速速上手小册》第9章:Numpy 在机器学习中的应用(2024 最新版)

文章目录 9.1 数据预处理9.1.1 基础知识9.1.2 完整案例&#xff1a;数据标准化9.1.3 拓展案例 1&#xff1a;缺失值处理9.1.4 拓展案例 2&#xff1a;非数值数据的转换 9.2 特征提取和处理9.2.1 基础知识9.2.2 完整案例&#xff1a;特征归一化9.2.3 拓展案例 1&#xff1a;特征…

MySQL知识点总结:构建可靠高性能的关系型数据库

摘要&#xff1a;MySQL是一款广泛使用的开源关系型数据库管理系统&#xff0c;具备可靠性和高性能的特点。本文将总结MySQL的一些重要知识点&#xff0c;帮助读者了解如何使用MySQL构建可靠高性能的关系型数据库。 正文&#xff1a; ### 1. 数据类型 MySQL支持多种数据类型&…

SpringBoot整合Activiti7—— 补偿边界/补偿中间事件(十五)

文章目录 补偿边界/补偿中间事件代码实现xml文件测试流程流程执行步骤 补偿边界/补偿中间事件 补偿事件可以被触发来回滚或修复之前已经完成的任务或活动。 补偿事件通常与错误边界事件&#xff08;Error Boundary Event&#xff09;结合使用。当任务或活动发生异常时&#xff…

SQL sever2008中创建用户并赋权

一、创建数据库dream CREATE DATABASE dream; 二、创建登录用户XZS 法一&#xff1a;使用SSMS创建 通过查询 sys.syslogins 系统视图来确定当前登录是否具有系统管理员权限。执行以下查询语句&#xff1a; SELECT name, isntname FROM sys.syslogins WHERE sysadmin 1;选…

Android Studio从零基础到APP上线(3)

第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…