题目链接
思路:模拟+双指针
分析:其实一共就是五种情况
为了文字简洁,这里规定一下
firstList中的当前段这里叫fdu吧
secondList中的当前段叫sdu吧
第一:fdu和sdu没有交集
第二:
第三:
第四:
第五:
区分这四种情况也就是更新最后那个的左边界即可。
代码:
class Solution {
public int[][] intervalIntersection(int[][] firstList, int[][] secondList) {
int flen = firstList.length;
int slen = secondList.length;
int fi = 0;
int si = 0;
List<int[]> list = new ArrayList<>();
int left = 0;
int right = Integer.MAX_VALUE;
//只有四种情况
while (si<slen && fi<flen){
//判断是否就没有交集,把较小的那个移到下一个段
if(firstList[fi][0]>secondList[si][1]){
si++;
continue;
}
//判断是否就没有交集,把较小的那个移到下一个段
if(secondList[si][0]>firstList[fi][1]){
fi++;
continue;
}
//到这里说明一定有交集
//左边界一定是两个左边界中最大的,右边界一定是两个右边界中最小的
if(secondList[si][0] > firstList[fi][0]){
//左边界
left = secondList[si][0];
if(secondList[si][1] < firstList[fi][1]){
//右边界
right = secondList[si][1];
//这里要注意,更新的是比较长的那个的左边界,并且另一个要走一步
firstList[fi][0] = right;
si++;
}else{
right = firstList[fi][1];
secondList[si][0] = right;
fi++;
}
//同理
}else{
left = firstList[fi][0];
if(secondList[si][1] < firstList[fi][1]){
right = secondList[si][1];
firstList[fi][0] = right;
si++;
}else{
right = firstList[fi][1];
secondList[si][0] = right;
fi++;
}
}
//到这里,肯定已经找到了一个答案
list.add(new int[]{left,right});
}
//整理答案
int[][] res = new int[list.size()][2];
for(int i = 0 ; i< list.size();i++){
res[i] = list.get(i);
}
return res;
}
}
好好生活。
不打扰是我的温柔。