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 cfpdef merge_base(intervals):if not intervals:return []if len(intervals) == 1:return intervalsresult = []while intervals:tmpArea = intervals.pop(0)bPop = Truewhile bPop:iPopCnt = 0bPop = Falsefor iIdx in range(len(intervals)):if intervals[-iIdx-1+iPopCnt][0] > tmpArea[1]:continueif intervals[-iIdx-1+iPopCnt][1] < tmpArea[0]:continueaddArea = intervals.pop(-iIdx-1+iPopCnt)iPopCnt += 1bPop = TruetmpArea[0] = min(tmpArea[0], addArea[0])tmpArea[1] = max(tmpArea[1], addArea[1])result.append([tmpArea[0], tmpArea[1]])return resultintervals = [[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 cfpdef merge_ext1(intervals):if not intervals:return []if len(intervals) == 1:return intervalsintervals.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 = newlefttmpright = newrightelif newright > tmpright:tmpright = newrightresult.append([tmpleft, tmpright])return resultintervals = [[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 cfpdef merge_ext2(intervals):if not intervals:return []if len(intervals) == 1:return intervalsintervals.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 = newlefttmpright = newrightelse:tmpright = max(tmpright, newright)result.append([tmpleft, tmpright])return resultintervals = [[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 cfpdef merge_ext3(intervals):if not intervals:return []if len(intervals) == 1:return intervalsimport numpy as nparr = 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 = newlefttmpright = newrightelif newright > tmpright:tmpright = newrightresult.append([tmpleft, tmpright])return resultintervals = [[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.hqwc.cn/news/442953.html

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

相关文章

Python模型预测库之shapash使用详解

概要 在机器学习领域&#xff0c;模型的可解释性对于理解模型的决策过程和进行决策支持非常重要。Python Shapash 库是一个强大的工具&#xff0c;旨在帮助数据科学家和机器学习工程师可视化和解释模型的预测结果。本文将深入探讨 Python Shapash 库的功能、用法以及如何在实际…

面试必考精华版Leetcode450. 删除二叉搜索树中的节点

题目&#xff1a; 代码&#xff08;首刷看解析&#xff09;&#xff1a; class Solution { public:TreeNode* deleteNode(TreeNode* root, int key) {if(rootnullptr){return nullptr;}if(root->val > key ){root->left deleteNode(root->left,key);return root;…

实验3:利用Linux的消息队列通信机制实现三个线程间的通信

调用原型 POSIX信号量–无名信号量 POSIX信号量是Pthread线程库提供的一种同步机制&#xff0c;包括无名信号量和有名信号量两种机制。无名信号量&#xff0c;常用于多线程间的同步&#xff0c;也可用于相关进程间的同步&#xff08;需置于相关进程间的共享内存区中&#xff…

【深度学习每日小知识】Model Accuracy 模型准确率

Model Accuracy 模型准确率 模型准确性是衡量机器学习 (ML) 模型基于数据做出预测或决策的能力的指标。它是用于评估 ML 模型性能的常用指标&#xff0c;可用于比较不同模型的性能或评估特定模型对于给定任务的有效性。 有多种不同的方法来衡量模型的准确性&#xff0c;具体取…

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

鸿蒙开发(ArkUI)—分析DatePicker组件

一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、DatePicker组件 日期选择器组件&#xff0c;用于根据指定日期范围创建日期滑动选择器。 子组件 无。 接口 DatePicker(options?: {start?: Date, end?: Date, selected?: …

心灵鸡汤美文:温暖你的每一寸心田

1.人生就像一杯茶&#xff0c;不会苦一辈子&#xff0c;但总会苦一阵子。只有经历过苦涩&#xff0c;才能品味到甜美的滋味。 2.每一次失败都是一次宝贵的经验&#xff0c;它教会我们如何更好地面对困难和挑战。不要害怕失败&#xff0c;因为失败是成功的前奏。 3.人生最重要的…

第九节HarmonyOS 常用基础组件20-Divider

1、描述 提供分割器组件&#xff0c;分割不同内容块或内容元素。 2、接口 Divider() 3、属性 名称 参数类型 描述 vertical boolean 使用水平分割线还是垂直分割线。 false&#xff1a;水平分割线 true&#xff1a;垂直分割线 color ResourceColor 分割线颜色 默认…

STL标准模版在VS2019中的使用方法

STL标准模版在VS2019中的使用方法 1.STL在VS2019中的位置 1.STL在VS2019中的位置 1.1找到程序安装位置&#xff1a; D:\visual_studio\IDE\VC\Tools\MSVC\14.29.30133\include

I.MX6ULL_Linux_驱动篇(53)linux USB驱动

I.MX6ULL USB 接口简介 I.MX6ULL 内部集成了两个独立的 USB 控制器&#xff0c;这两个 USB 控制器都支持 OTG 功能。I.MX6ULL 内部 USB 控制器特性如下&#xff1a; ①、有两个 USB2.0 控制器内核分别为 Core0 和 Core1&#xff0c;这两个 Core 分别连接到 OTG1 和OTG2。 ②、…

【每日一题】2670. 找出不同元素数目差数组-2024.1.31

题目&#xff1a; 2670. 找出不同元素数目差数组 给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示&#xff0c;其中 diff[i] 等于前缀 nums[0, ..., i] 中不同元素的数目 减去 后缀 nums[i …

AI界炸了!贾扬清竟用500行代码打造搜索引擎Demo登顶GitHub!你还在觉得构建AI应用难吗?

AI大神贾扬清周末狂炫技&#xff01;仅用500行代码打造的AI搜索引擎Demo就登顶GitHub热榜&#xff0c;告诉世界构建AI应用不过如此。谁说打造AI应用难如登天&#xff1f;贾扬清用实际行动告诉你&#xff1a;天下没有难构建的AI应用&#xff01; 更多精彩内容关注知乎&#xff…