问题描述
给定两个由一些 闭区间 组成的列表,firstList
和 secondList
,其中 firstList[i] = [starti, endi]
而 secondList[j] = [startj, endj]
。每个区间列表都是成对 不相交 的,并且 已经排序 。
返回这 两个区间列表的交集 。
形式上,闭区间 [a, b]
(其中 a <= b
)表示实数 x
的集合,而 a <= x <= b
。
两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3]
和 [2, 4]
的交集为 [2, 3]
。
提示:
- \(0 <= firstList.length, secondList.length <= 1000\)
- \(firstList.length + secondList.length >= 1\)
- \(0 <= start_i < end_i <= 10^9\)
- \(end_i < start_{i+1}\)
- \(0 <= start_j < end_j <= 10^9\)
- \(end_j < start_{j+1}\)
示例
示例 1:
输入:firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
示例 2:
输入:firstList = [[1,3],[5,9]], secondList = []
输出:[]
示例 3:
输入:firstList = [], secondList = [[4,8],[10,12]]
输出:[]
示例 4:
输入:firstList = [[1,7]], secondList = [[3,10]]
输出:[[3,7]]
解题思路
在遍历 firstList 和 secondList 时,我们大致可以分为四种情况进行讨论。
首先是 firstList[i] 和 secondList[j] 不相交的情况,包括 minB > maxA 和 minA > maxB 这两种情况。
- minB > maxA : 此时应该将 i 移动到 firstList 的下一个节点
- minA > maxB :此时应该将 j 移动到 secondList 的下一个节点
其次, firstList[i] 和 secondList[j] 相交时也有四种情况,包括 minA <= minB < maxA <= maxB,minA <= minB < maxB <= maxA, minB <= minA < maxB <= maxA, minB <= minA < maxA <= maxB
- minA <= minB < maxA <= maxB :此时应该将 i 移动到 firstList 的下一个节点
- minA <= minB < maxB <= maxA :此时应该将 j 移动到 secondList 的下一个节点
- minB <= minA < maxB <= maxA :此时应该将 j 移动到 secondList 的下一个节点
- minB <= minA < maxA <= maxB :此时应该将 i 移动到 firstList 的下一个节点
按照上面的分类,实现代码:
class Solution {
public:
vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
if(!firstList.size() || !secondList.size()){
return {};
}
vector<vector<int>> res;
int minA = firstList[0][0];
int minB = secondList[0][0];
int maxA = firstList[0][1];
int maxB = secondList[0][1];
int i = 0;
int j = 0;
while(true){
if(minA > maxB){ // 两个区间不相交
if(++j < secondList.size()){
minB = secondList[j][0];
maxB = secondList[j][1];
}
else{
break;
}
}
else if(minB > maxA){ // 两个区间不相交
if(++i < firstList.size()){
minA = firstList[i][0];
maxA = firstList[i][1];
}
else{
break;
}
}
else if(minA >= minB){ // 两个区间相交
if(maxA <= maxB){ // 判断哪个节点的最大值更小,最大值更小的节点需要移动至下一个节点
res.push_back({minA, maxA});
if(++i < firstList.size()){
minA = firstList[i][0];
maxA = firstList[i][1];
}
else{
break;
}
}
else{
res.push_back({minA, maxB});
if(++j < secondList.size()){
minB = secondList[j][0];
maxB = secondList[j][1];
}
else{
break;
}
}
}
else{
if(maxB <= maxA){
res.push_back({minB, maxB});
if(++j < secondList.size()){
minB = secondList[j][0];
maxB = secondList[j][1];
}
else{
break;
}
}
else{
res.push_back({minB, maxA});
if(++i < firstList.size()){
minA = firstList[i][0];
maxA = firstList[i][1];
}
else{
break;
}
}
}
}
return res;
}
};
标签:firstList,minA,minB,986,力扣,secondList,区间,maxA,leetcode
From: https://www.cnblogs.com/greatestchen/p/16945923.html