思路
题目说,给定的两个区间列表都是排好序的
- 用两个指针,分别扫描 A、B 数组,根据子区间的左右端,求出一个交集区间
- 指针移动,直至指针越界,得到由交集区间组成的数组。
怎么求交集区间
注意绿色箭头,交集区间的 start 取的是 A、B 子区间中较大的左界。
注意红色箭头,交集区间的 end 取的是 A、B 子区间中较小的右界。
只要 start <= end,就形成了一个交集区间。
双指针移动的时机
求完一个交集区间后,较早结束的子区间,不可能再和别的子区间有重叠,它的指针要移动。
较长的子区间还有可能和别人重叠,它的指针暂时不动。
class Solution {
public int[][] intervalIntersection(int[][] A, int[][] B) {
List<int[]> ans = new ArrayList();
int i = 0, j = 0;
while (i < A.length && j < B.length) {
// 交集区间的左端,取它们的较大者
int lo = Math.max(A[i][0], B[j][0]);
// 交集区间的右端,取它们的较小者
int hi = Math.min(A[i][1], B[j][1]);
//形成了交集区间
if (lo <= hi) ans.add(new int[]{lo, hi});
// 谁先结束,谁的指针就前进,考察下一个子区间
if(A[i][1]<B[j][1]) i++;
else j++;
}
return ans.toArray(new int[ans.size()][2]);
}
}