56-合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

解题思路

思路

如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并成一个大区间,它们在排完序的列表中是连续的:

算法

我们用数组 merged 存储最终的答案。

首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间:

1.如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;
2.否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。

正确性证明

上述算法的正确性可以用反证法来证明:在排完序后的数组中,两个本应合并的区间没能被合并,那么说明存在这样的三元组 (i, j, k)以及数组中的三个区间 a[i], a[j], a[k] 满足 i < j < k 并且 (a[i], a[k])可以合并,但 (a[i], a[j])和 (a[j], a[k]) 不能合并。这说明它们满足下面的不等式:

         a[i].end<a[j].start(a[i] 和 a[j] 不能合并)a[j].end<a[k].start(a[j] 和 a[k] 不能合并)a[i].end≥a[k].start(a[i] 和 a[k] 可以合并)

我们联立这些不等式(注意还有一个显然的不等式 a[j].start≤a[j].end),可以得到:

         a[i].end<a[j].start≤a[j].end<a[k].start

产生了矛盾!这说明假设是不成立的。因此,所有能够合并的区间都必然是连续的

C++实现

class Solution {public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if (intervals.size() == 0) {return {};}sort(intervals.begin(), intervals.end());vector<vector<int>> merged;for (int i = 0; i < intervals.size(); ++i) {int L = intervals[i][0], R = intervals[i][1];if (!merged.size() || merged.back()[1] < L) {merged.push_back({L, R});}else {merged.back()[1] = max(merged.back()[1], R);}}return merged;}
};
  1. 时间复杂度:O(nlogn),其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O(nlogn)。
  2. 空间复杂度:O(logn)空间复杂度:O(logn),其中 n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。O(logn) 即为排序所需要的空间复杂度。

1288-删除被覆盖区间

给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。

解题思路

可参照56题合并区间,首先对区间进行排序。
排序完成的两个相邻区间有如下三种相对位置:

如果当前区间的左端点和数组 merged 中最后一个区间的左端点相等,根据区间覆盖的定义,这两个区间必有一个被覆盖。
如果当前区间的左端点大于数组 merged 中最后一个区间的左端点,分为两种情况:
(1)当前区间的右端点小于数组 merged 中最后一个区间的右端点,不做任何处理;
(2)当前区间的右端点大于数组 merged 中最后一个区间的右端点,我们可以直接将这个区间加入数组 merged 的末尾。

C++实现

class Solution {public:int removeCoveredIntervals(vector<vector<int>>& intervals) {if(!intervals.size())return {};sort(intervals.begin(),intervals.end());vector<vector<int>>merged;for(int i=0;i<intervals.size();++i){int L=intervals[i][0],R=intervals[i][1];if(!merged.size()||(merged.back()[0]<L&&merged.back()[1]<R))merged.push_back({L,R});//else if(intervals.back()[0]<L&&intervals.back()[1]>=R)elsemerged.back()[1]=max(merged.back()[1],R);}return merged.size();}
};
  1. 时间复杂度:O(nlogn),其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O(nlogn)。
  2. 空间复杂度:O(logn)空间复杂度:O(logn),其中 n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。O(logn) 即为排序所需要的空间复杂度。

986-区间列表的交集

给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序 。
返回这 两个区间列表的交集 。
形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。
两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3] 。

解题思路

我们使用双指针(L和R)的方法在firstList 和secondList 中游走,找出交集
两个区间没有交集的情况为:

用代码表示为

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

取反,or也要取反,就是交集存在的情况

a2>=b1 and b1>=a2

接下来,交集存在的情况,它们有什么共同点?

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

while(L<firstList.size()&&R<secondList.size())
{int a1=firstList[L][0],a2=firstList[L][1];int b1=secondList[R][0],b2=secondList[R][1];if(b2>=a1&&b2>=a1)sec.push_back({max(a1,b1),min(a2,b2)});}

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

if(b2<a2)R++;
elseL++;
end

a2=b2时,L和R其中一个++就可以。

C++实现

class Solution {public:vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {int L=0,R=0;vector<vector<int>>sec;while(L<firstList.size()&&R<secondList.size()){int F1=firstList[L][0],F2=firstList[L][1];int S1=secondList[R][0],S2=secondList[R][1];if(S2>=F1&&F2>=S1)sec.push_back({max(F1,S1),min(F2,S2)});if(S2<F2)++R;else ++L;}return sec;}
};
  1. 时间复杂度:O(M + N),其中 M, N分别是数组 A 和 B 的长度。
  2. 空间复杂度:O(M + N),答案中区间数量的上限。

Leetcode-区间问题相关推荐

  1. leetcode 区间问题

    文章目录 304. 二维区域和检索 - 矩阵不可变[前缀和] 二维前缀和 二维前缀和 一维前缀和 模板 总结 995. K 连续位的最小翻转次数[贪心.差分.滑动窗口]!!! 贪心差分 滑动窗口 总结 ...

  2. leetcode —— 区间加法

    假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k​​​​​​​ 个更新的操作. 其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc] ...

  3. LeetCode 区间子数组个数

    给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = [2, 1, 4, 3] ...

  4. LeetCode简单题之汇总区间

    题目 给定一个 无重复元素 的 有序 整数数组 nums . 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 .也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范 ...

  5. 《LeetCode力扣练习》第56题 合并区间 Java

    <LeetCode力扣练习>第56题 合并区间 Java 一.资源 题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, ...

  6. LeetCode:汇总区间【228】

    LeetCode:汇总区间[228] 题目描述 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7] 输出: ["0->2&quo ...

  7. LeetCode 55跳跃游戏56合并区间57插入区间

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

  8. 【LeetCode 986】 区间列表的交集(区间交集)

    给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj ...

  9. LeetCode 664. 奇怪的打印机(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. ...

  10. LeetCode 1851. 包含每个查询的最小区间(排序 + 离线查询 + 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个二维整数数组 intervals ,其中 intervals[i] = [lefti, righti] 表示第 i 个区间开始于 lefti .结 ...

最新文章

  1. Android include 标签使用
  2. 阿里达摩院数学竞赛考题曝光!4道题限时48小时,网友:题目能看懂但就是不会做...
  3. PHP中常用的正则表达式函数
  4. mysql左键关联_MySQL的:左键删除重复列加入,3个表
  5. SQL Server Always On可用性组中的数据同步
  6. spingCloud 整合netty
  7. 谷歌开源 VR 应用
  8. 如何设计一种简单的恒流/恒压降压转换器
  9. YDOOK:STM32: 芯片在线需求选型工具
  10. 深入理解:面向服务与微服务架构
  11. 【TencentOS tiny学习】源码分析(7)——事件
  12. python爬虫下载小说
  13. 2023江苏大学计算机考研信息汇总
  14. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例
  15. Android中使用Post带参数请求的方法
  16. ARM嵌入式主板之路
  17. pandorabox php,Openwrt Pandorabox 挂载摄像头 定时拍照上传百度网盘,实现实时监控(优酷路由宝)...
  18. 【SGU】117. Counting 快速幂
  19. 这篇讲MySQL海量数据分库分表的,实在太过瘾了!
  20. 微信小程序——云开发

热门文章

  1. win10 +anaconda+pytorch_gpu
  2. mybatis XML 中<if>、<choose>、<when>、<otherwise>等标签的使用?多条件查询该怎么处理?
  3. 新小米手机--首次使用
  4. LightProxy
  5. 证券公司信息化12-IT基础设施2-什么是局域网?什么是广域网?CCNP是什么证书?电信能提供长途数据线路吗?
  6. 基于qt和opencv3人脸检测
  7. 数字电路11-异步计数器
  8. 6款常用且好用的Python编辑器推荐!
  9. E3【数据可视化】【组件】基于Python+Flask+Echarts+HTML5拖放(DragDrop)实现的可拖放布局并自动保存布局的动态饼图
  10. var _ HelloServiceInterface = (*HelloServiceClient)(nil)的特殊含义