相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
class Solution {
public int[][] intervalIntersection(int[][] firstList, int[][] secondList) {
//我们称 b 为区间 [a, b] 的末端点。
//在两个数组给定的所有区间中,假设拥有最小末端点的区间是 A[0]。(为了不失一般性,该区间出现在数组 A 中)
//然后,在数组 B 的区间中, A[0] 只可能与数组 B 中的至多一个区间相交。
// (如果 B 中存在两个区间均与 A[0] 相交,那么它们将共同包含 A[0] 的末端点,但是 B 中的区间应该是不相交的,所以存在矛盾)
ArrayList<int[]> list = new ArrayList<>();//创建存储列表
int i = 0;//指向firstList
int j = 0;//指向secondList
while (i <firstList.length&& j<secondList.length ){//遍历
//找出两个数组中【头部】最大的那个值
int lo = Math.max(firstList[i][0], secondList[j][0]);
//找出两个数组中【尾部】最小的那个值
int hi = Math.min(firstList[i][1], secondList[j][1]);
if (lo <=hi ){
//当尾部最小的值大于等于头部这个值,说明在下标i和j这个下标的区间内,它们的交集就是【lo,hi】
list.add(new int[]{lo,hi});
}
if (firstList[i][1]<secondList[j][1]){//当i和j下标的最大值比较,i下标的最大值小的话,要将i下标移动
// 这样移动到i+1,因为有可能i+1的最小值是j下标的最大值,所以要再次循环
i++;
}else {//当i和j下标的最大值比较,j下标的最大值小的话,要将j下标移动
// 这样移动到j+1,因为有可能j+1的最小值是i下标的最大值,所以要再次循环
j++;
}
}
return list.toArray(new int[list.size()][]);//转成数组
}
}