给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。
每个区间列表都是成对不相交 的,并且已经排序 。返回这两个区间列表的交集 。形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3] 。
示例 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]]
思路:
两个列表需从头开始找是否有交集,用cur_f和cur_s代表两列表的指针,区间无交集一定是 f的左区间大于s的右区间,或者是f右区间小于s左区间。其他情况则都是有交集需要进行处理。细节如代码所示
class Solution {
public:
vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
int nf=firstList.size();
int ns=secondList.size();
int cur_f=0,cur_s=0;
vector<vector<int>> ret;
while(cur_f<nf&&cur_s<ns)
{
//两种无交集情况
if(firstList[cur_f][0]>secondList[cur_s][1]) cur_s++;
else if(firstList[cur_f][1]<secondList[cur_s][0]) cur_f++;
else{
//处理交集
int left=max(firstList[cur_f][0],secondList[cur_s][0]);
int right=min(firstList[cur_f][1],secondList[cur_s][1]);
ret.push_back({left,right});
//把结尾更大的先留着,再找是否有交集
if(firstList[cur_f][1]>secondList[cur_s][1]) cur_s++;
else if(firstList[cur_f][1]<secondList[cur_s][1]) cur_f++;
else
{
//在后面的要往前追 再找交集
if(firstList[cur_f][0]>secondList[cur_s][0]) cur_s++;
else if(firstList[cur_f][0]<secondList[cur_s][0]) cur_f++;
else
{
//左右区间都相等
cur_s++;
cur_f++;
}
}
}
}
return ret;
}
};