区间调度之区间交集问题

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

一、解题思路

解决区间问题的思路一般是先排序,以便操作,不过题目说已经排好序了,那么可以用两个索引指针在 A 和 B 中游走,把交集找出来,代码大概是这样的:

# A, B 形如 [[0,2],[5,10]...]
def intervalIntersection(A, B):i, j = 0, 0res = []while i < len(A) and j < len(B):# ...j += 1i += 1return res

不难,我们先老老实实分析一下各种情况。

首先,对于两个区间,我们用 [a1,a2] 和 [b1,b2] 表示在 A 和 B 中的两个区间,那么什么情况下这两个区间没有交集呢


只有这两种情况,写成代码的条件判断就是这样:

if b2 < a1 or a2 < b1:[a1,a2] 和 [b1,b2] 无交集

那么,什么情况下,两个区间存在交集呢?根据命题的否定,上面逻辑的否命题就是存在交集的条件:

# 不等号取反,or 也要变成 and
if b2 >= a1 and a2 >= b1:[a1,a2] 和 [b1,b2] 存在交集

接下来,两个区间存在交集的情况有哪些呢?穷举出来:

这很简单吧,就这四种情况而已。那么接下来思考,这几种情况下,交集是否有什么共同点呢?

我们惊奇地发现,交集区间是有规律的!如果交集区间是 [c1,c2],那么 c1=max(a1,b1),c2=min(a2,b2)!这一点就是寻找交集的核心,我们把代码更进一步:

while i < len(A) and j < len(B):a1, a2 = A[i][0], A[i][1]b1, b2 = B[j][0], B[j][1]if b2 >= a1 and a2 >= b1:res.append([max(a1, b1), min(a2, b2)])# ...

最后一步,我们的指针 i 和 j 肯定要前进(递增)的,什么时候应该前进呢?


是否前进,只取决于 a2 和 b2 的大小关系。代码:

while i < len(A) and j < len(B):# ...if b2 < a2:j += 1else:i += 1

完整代码:

# A, B 形如 [[0,2],[5,10]...]
def intervalIntersection(A, B):i, j = 0, 0 # 双指针res = []while i < len(A) and j < len(B):a1, a2 = A[i][0], A[i][1]b1, b2 = B[j][0], B[j][1]# 两个区间存在交集if b2 >= a1 and a2 >= b1:# 计算出交集,加入 resres.append([max(a1, b1), min(a2, b2)])# 指针前进if b2 < a2: j += 1else:       i += 1return res

C++代码:

class Solution {public:vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B) {//保存结果vector<vector<int>> ret;if(A.empty() || B.empty()){return ret;}//i和j两个下标索引int i = 0;int j = 0;while(i < A.size() && j < B.size()){//下面四个变量的含义相见博客int a1 = A[i][0];int a2 = A[i][1];int b1 = B[j][0];int b2 = B[j][1];//代表区间有交集,自己画个图就OKif(b2 >= a1 && a2 >= b1){//max(a1,b1),min(a2,b2)两个区间的交集部分ret.push_back({max(a1,b1),min(a2,b2)});}//更新i和j下标索引,b2 < a2 就代表i所在的区间大于j所在的区间,更新j//是因为i区间长于j区间的部分还可能和j的下一个区间继续重叠,还需要继续判断//所以更新j而不是更新iif(b2 < a2){j++;}else//反之同理{i++;}}   return ret;}
};

总结一下,区间类问题看起来都比较复杂,情况很多难以处理,但实际上通过观察各种不同情况之间的共性可以发现规律,用简洁的代码就能处理。

区间调度之区间交集问题相关推荐

  1. 区间调度之区间合并问题

    区间调度之区间合并问题 还是先看一道题: 一.解题思路 一个区间可以表示为 [start, end],区间重叠区间调度问题,需要按 end 排序,以便满足贪心选择性质.而对于区间合并问题,其实按 en ...

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

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

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

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

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

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

  5. Intervals on the Ring 环状数轴区间-模数-构造-区间交并集

    题意 : 构造一系列区间满足它们的交集为输入的区间的并集 思路 : 总的来说就是 a[0].l a[m - 1].r a[1].l a[0].r a[2].l a[1].r - 因此转化为 a[i]. ...

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

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

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

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

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

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

  9. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

最新文章

  1. 财务需要学python-8年老财务:财务分析学python就能提高效率?一半人是骗子
  2. OpenCV中使用类VideoCapture加载视频和打开摄像头
  3. bootstrap4 左侧导航栏 优秀 大气_Axure导出html没有左侧菜单栏(导航栏)?——Mac Safari...
  4. java开发常用jar包_Java开发中常用jar包整理及使用
  5. 玩ts要注意什么_番禺三维创意拍摄要注意什么
  6. 【转载保存】索引文件锁LockFactory
  7. 小程序开发(8)-之跳转第三方小程序设计
  8. 数字图像处理--图像颜色
  9. 一道面试题引发的“血案”
  10. install 命令用法详解
  11. sublime text 3中安装ctags支持函数跳转,安装convertToUtf8支持中文步骤[工具篇]
  12. POI操作Excel详解,HSSF和XSSF两种方式
  13. 编程中的幂等性(一):http幂等性
  14. c语言常量指针和指针常量
  15. batchplot放到哪个文件夹_AutoCAD批量打印软件BatchPlot安装方法及使用教程
  16. 详解 欧拉角与四元数
  17. 使用百度地图接口绘制地图
  18. 解决centos 7 打开php文件直接下载问题
  19. 插上翅膀,看华为云CDN如何带你网上冲浪
  20. Ubuntu 开机慢的问题排查

热门文章

  1. 【报错笔记】Navicat连接数据库显示2003错误,无法连接到数据库
  2. Vue项目从无到有的部署上Github page
  3. 数据库连接池的实现及原理
  4. GlusterFS安装配置
  5. 牛客 - 四等分的角度(几何)
  6. CodeForces - 1311D Three Integers(暴力)
  7. CodeForces - 765D Artsem and Saunders(数学化简+构造+思维)
  8. HDU - 2049 不容易系列之(4)——考新郎(错排问题+组合数学)
  9. 扩展中国剩余定理(模板)
  10. 中的多行卡片如何居中_编程中如何让图片垂直居中?两种方案分享给大家