区间调度之区间合并问题

还是先看一道题:

一、解题思路

一个区间可以表示为 [start, end],区间重叠区间调度问题,需要按 end 排序,以便满足贪心选择性质。而对于区间合并问题,其实按 end 和 start 排序都可以,不过为了清晰起见,我们选择按 start 排序。

显然,对于几个相交区间合并后的结果区间 x,x.start 一定是这些相交区间中 start 最小的,x.end 一定是这些相交区间中 end 最大的。

由于已经排了序,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

C++代码:

class Solution {public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> ret;if(intervals.empty()){return ret;}//先对intervals的每个区间按第一个元素(start)进行生序排序sort(intervals.begin(),intervals.end(),[&, this](vector<int> &v1, vector<int> &v2) { return v1[0] < v2[0];});//遍历整个数组for (int i = 0; i < intervals.size(); ++i) {//定义一个临时变量,方便用来寻找区间的右边界vector<int> temp = intervals[i];//代表当前区间和intervals中的下一个区间重叠//规定区间[start,end]//temp[1] >= intervals[i+1][0]代表当前区间的end位置大于等于下一个区间的start位置//如果出现第一个区间的end大于第二个区间的end,可以直接忽略,没起到任何作用while (i + 1 < intervals.size() && temp[1] >= intervals[i+1][0]) {//继续遍历,因为此时的右边界不一定是最优的,可能还有重叠区间++i;//更新区间的右边界temp[1] = max(temp[1], intervals[i][1]);}//记录结果ret.push_back(temp);}return ret;}
};

至此,区间合并问题就解决了。

区间调度之区间合并问题相关推荐

  1. 区间调度之区间交集问题

    区间调度之区间交集问题 区间调度问题共写了3片博客,前两篇重叠区间和区间合并分别讲了区间的最大不相交子集和重叠区间的合并,今天再写一个算法,可以快速找出两组区间的交集. 一.解题思路 解决区间问题的思 ...

  2. java加权区间调度_区间调度问题详解

    今天给大家介绍一下区间调度问题.区间调度是一类难度比较大,但同时应用比较广的问题,经常会在面试中以各种形式出现.本文将会介绍区间调度的各种变形,希望能使大家在面临区间调度问题时得心应手,并可以在实际工 ...

  3. 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp

    文章目录 题目分析 题目链接 题目分析 只能合并相邻两堆.求体力最小值 数据比较弱,最多300堆,每堆重量不超过1000. 状态表示 f[i][j]表示合并区间[i,j]需要的最小体力 状态转移 把区 ...

  4. matlab车辆贪心作业调度,贪心算法-区间调度-Interval Scheduling

    什么是贪心算法呢? 贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高. 比如说一个算法问题使用暴力解法需要指数级时间,如果 ...

  5. 贪心算法—区间调度 电影节(POJ 4151)

    贪心算法--区间选取问题 或是区间调度问题 本文解决一个很经典的贪心算法问题 Interval Scheduling(区间调度问题).给你很多形如[start,end]的闭区间,请你设计一个算法,算出 ...

  6. 【线段树】区间修改(区间覆盖、区间权值加)标记下放操作的逻辑顺序

    洛谷传送门:月下"毛景树" 由于没有合适的题目,就从这道题入手,解此题时用到的算法/数据结构包括: 树链剖分 线段树(区间覆盖.区间加.区间查询.单点修改) 这道题被我调试了四个小 ...

  7. CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)

    CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换)   首先一共有四个操作,第一个和第四个都是线段树的基本操作,直接用线段树实现.      第 ...

  8. 数值分区间_EXCEL统计区间个数的专属函数

    这次我们学习一个新的函数! 数字区间个数统计 如下图,要求统计四个成绩区间段的人数. 如果只统计一个区间内的人数,比如上图统计60-80分之间的人数,你会怎么办呢? 1.条件计数 =COUNTIF(B ...

  9. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

    #6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个长为 ...

最新文章

  1. SurfaceView 间取得焦点
  2. json.net使用说明一
  3. 多线程编程之死锁已经死锁产生的原因
  4. 超过200m文件发送_苦等10年的微信功能——大文件功能来了
  5. 表里有索引,为什么还都是全表扫描?
  6. 基于JQuery实现滚动到页面底端时自动加载更多信息
  7. Hibernate READ_ONLY CacheConcurrencyStrategy如何工作
  8. jq分页 不刷新页面_jQuery无刷新分页完整实例代码
  9. 俞敏洪直播:最近读了不少关于苏东坡的书
  10. 图像直方图原理与Python实现
  11. virtualenvwrapper安装及使用
  12. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——01-06 工作内容:做个工程师,而非程序工人...
  13. 组播负载分担、静态组播路由和MBGP技术原理
  14. php 调用speex解码库,怎么增加speex解码库
  15. bootstrap4笔记
  16. 学习笔记(15):C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流-opencv播放rtsp海康摄像头和播放系统摄像头...
  17. ios获取麦克风音频输入数据(PCM)计算DBSPL后与真实值差距很大
  18. 【测试用例练习】二、手机app测试点
  19. 单片机软件设计架构(C语言)
  20. Centos 配置阿里yum源

热门文章

  1. MongoEngine MongoDB 的 ORM 库
  2. DESIGN_OUTLINE' and 'CUTOUT' are the preferred subclasWARNING
  3. MySQL逻辑物理备份测试
  4. Windows XP 专业版与家庭版的区别
  5. 通过流进行字符集编码转换
  6. linux i18n修改,中文版英文版体现
  7. [C#]我自己写的一个对字节中每位进行修改值的函数
  8. 去除重复数据的SQL语句
  9. CodeForces - 1451E2 Bitwise Queries (Hard Version)(交互+构造+位运算)
  10. 牛客多校4 - Count New String(序列自动机+广义后缀自动机)