题目来源
题目描述
class Solution {
public:
vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
}
};
题目解析
思路
- 因为两个区间都是有序的,所以可以用双指针
- 一个指针扫描A数组,一个指针扫描B数组,根据子区间的两端,求出一个交集区间
- 指针移动,直到指针越界,得到由交集区间组成的数组
怎样求交集区间
- 注意绿色箭头,交集区间的start取的是A、B子区间中较大的左界
- 只要满足start <= end,就形成了一个交集区间
指针怎么移动
- 求完一个交集区间后,较早结束的子区间,不可能与别的子区间重叠,它的指针要移动
- 较长的子区间还有可能与别人重叠,它的指针就暂时不动
实现
class Solution {
public:
vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
vector<vector<int>> ans;
int i = 0, j = 0;
while (i < firstList.size() && j < secondList.size()){
int start = std::max(firstList[i][0], secondList[j][0]);
int end = std::min(firstList[i][1], secondList[j][1]);
if(start <= end){
ans.push_back({start, end});
}
if(firstList[i][1] < secondList[j][1]){
i++;
}else{
j++;
}
}
return ans;
}
};