leetcode 区间列表的交集

题目链接
思路:模拟+双指针
分析:其实一共就是五种情况
为了文字简洁,这里规定一下
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;
    }
}

好好生活。
不打扰是我的温柔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值