数组的合并和升序排列_区间调度问题之区间合并
读完本文,你可以去力扣拿下如下题目:
56.合并区间
-----------
上篇文章用贪心算法解决了区间调度问题:给你很多区间,让你求其中的最大不重叠子集。
其实对于区间相关的问题,还有很多其他类型,本文就来讲讲区间合并问题(Merge Interval)。
LeetCode 第 56 题就是一道相关问题,题目很好理解:
![](/assets/blank.gif)
我们解决区间问题的一般思路是先排序,然后观察规律。
PS:我认真写了 100 多篇原创,手把手刷 200 道力扣题目,全部发布在 labuladong的算法小抄,持续更新。建议收藏,按照我的文章顺序刷题,掌握各种算法套路后投再入题海就如鱼得水了。
一、思路
一个区间可以表示为 [start, end]
,前文聊的区间调度问题,需要按 end
排序,以便满足贪心选择性质。而对于区间合并问题,其实按 end
和 start
排序都可以,不过为了清晰起见,我们选择按 start
排序。
![](/assets/blank.gif)
显然,对于几个相交区间合并后的结果区间 x
,x.start
一定是这些相交区间中 start
最小的,x.end
一定是这些相交区间中 end
最大的。
![](/assets/blank.gif)
由于已经排了序,x.start
很好确定,求 x.end
也很容易,可以类比在数组中找最大值的过程:
int max_ele = arr[0];
for (int i = 1; i < arr.length; i++) max_ele = max(max_ele, arr[i]);
return max_ele;
二、代码
# intervals 形如 [[1,3],[2,6]...]
def merge(intervals):if not intervals: return []# 按区间的 start 升序排列intervals.sort(key=lambda intv: intv[0])res = []res.append(intervals[0])for i in range(1, len(intervals)):curr = intervals[i]# res 中最后一个元素的引用last = res[-1]if curr[0] <= last[1]:# 找到最大的 endlast[1] = max(last[1], curr[1])else:# 处理下一个待合并区间res.append(curr)return res
看下动画就一目了然了:
![](/assets/blank.gif)
至此,区间合并问题就解决了。本文篇幅短小,因为区间合并只是区间问题的一个类型,后续还有一些区间问题。本想把所有问题类型都总结在一篇文章,但有读者反应,长文只会收藏不会看… 所以还是分成小短文吧,读者有什么看法可以在留言板留言交流。
本文终,希望对你有帮助。
_____________
我的 在线电子书 有 100 篇原创文章,手把手带刷 200 道力扣题目,建议收藏!对应的 GitHub 算法仓库 已经获得了 70k star,欢迎标星!
数组的合并和升序排列_区间调度问题之区间合并相关推荐
- 数组的合并和升序排列_每日“力扣”系列10 下一个排列
今天继续力扣数组标签的算法题,力扣第31题,难度等级为中等,题目描述如下: 题目要点概括如下: 1.输入部分为一个有顺序的数组,按照数字的前后顺序,这个数字代表着一个位数不定的数字,这里程它为原数字. ...
- 数组的合并和升序排列_JavaScript - 数组排序 6 种常见算法是什么?
前言 着急用的话,选择前两个就行了,后面的看看就好. 开发中,遇到数组排序的需求很频繁,这篇文章会介绍几个常见排序思路. 一.希尔排序(性能最好) 如果要从大到小排列,则 while(arr[n] & ...
- 数组的合并和升序排列_leetcode No.31 下一个排列
题目链接: 下一个排列 - 力扣(LeetCode)leetcode-cn.com 题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个 ...
- 数组的合并和升序排列_leetcode 33 搜索旋转排序数组
给你一个升序排列的整数数组 nums ,和一个整数 target . 假设按照升序排序的数组在预先未知的某个点上进行了旋转.(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...
- 在升序排序的数组中插入一个元素 用函数编程实现在一个按升序排序的数组中查找x应插入的位置,将x插入数组中,使数组元素仍按升序排列。 提示:插入(Insertion)是数组的基本操作之一。插入法排序算法
我先使用了三个函数参数,参数分别为数组a[],数组元素数量number和需要插入的数字n.函数定义为int f(int a[],int number,int n); #include <stdi ...
- 单一类型数组中的去重升序排列问题
得到一组新的单一类型且未知长度的数组,要求剔除掉其中重复的数据,并按照升序排列此已去重的数组 1.目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个,放到新数组中去重. 2.核心 ...
- wireshark合并多个文件_小技巧:快速合并多个excel文件(收藏版)
我们在日常工作或科研中,总会遇到需要汇总多个excel的情况,若仅仅是几个表格,大多人会直接复制,若有上百个表格呢? 那么小编就告诉大家一个稍微简洁一点的方法,将多个单独的excel表格快速合 ...
- C语言实现int数组类型冒泡法升序排列
#include <stdio.h> void zjj(int* zyq,int sz)//当传递的是数组时传递的是数组第一个数的指针 { int i=0; int j=0 ...
- python写csv文件按升序排列_用python给csv里的数据排序的具体代码
1.使用argparse组件,获取命令行参数:使用re组件,获取需要查找的字符串所在行 2.使用pandas组件,对文件进行排序. 3.命令行执行数据获取及排序,写入文件: 以下是完整代码: #cod ...
最新文章
- Knowladge_网站学习_jQuery插件
- VC内存泄露检查工具:Visual Leak Detector
- vue学习:7、路由跳转
- qt中update()的粗略理解
- ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea
- aelf宣布推出集中式资产管理系统CAM
- fer2013人脸表情数据实践
- Atitit.复合文档的格式 标准化格式
- 学习总结(一):ad画板总结
- vrep和simulink联合仿真
- mescroll源码
- [创翼]解除一机一号限制,并实现断电、断网后自动拨号(附:高校进阶个人组网方案)
- java开源cad_.Net开源项目(包含CAD支持)
- 2020年5月-苹果审核新规则
- 7-4 疯狂星期四!!!!!
- 西游记中金箍棒的来历和巨大威力
- Web全栈~18.jQuery
- DigitalPersona 指纹仪的使用
- 【Codeforces】764A Compote
- Go基础天天练之通道