力扣 leetcode 986. 区间列表的交集

问题描述

给定两个由一些 闭区间 组成的列表,firstListsecondList ,其中 firstList[i] = [starti, endi]secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序

返回这 两个区间列表的交集

形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b

两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3][2, 4] 的交集为 [2, 3]

提示:

  • 0<=firstList.length,secondList.length<=1000
  • firstList.length+secondList.length>=1
  • 0<=starti<endi<=109
  • endi<starti+1
  • 0<=startj<endj<=109
  • endj<startj+1

示例

示例 1:

输入:firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

示例 2:

输入:firstList = [[1,3],[5,9]], secondList = []
输出:[]

示例 3:

输入:firstList = [], secondList = [[4,8],[10,12]]
输出:[]

示例 4:

输入:firstList = [[1,7]], secondList = [[3,10]]
输出:[[3,7]]

解题思路

在遍历 firstList 和 secondList 时,我们大致可以分为四种情况进行讨论。

首先是 firstList[i] 和 secondList[j] 不相交的情况,包括 minB > maxA 和 minA > maxB 这两种情况。

  • minB > maxA : 此时应该将 i 移动到 firstList 的下一个节点
  • minA > maxB :此时应该将 j 移动到 secondList 的下一个节点

其次, firstList[i] 和 secondList[j] 相交时也有四种情况,包括 minA <= minB < maxA <= maxB,minA <= minB < maxB <= maxA, minB <= minA < maxB <= maxA, minB <= minA < maxA <= maxB

  • minA <= minB < maxA <= maxB :此时应该将 i 移动到 firstList 的下一个节点
  • minA <= minB < maxB <= maxA :此时应该将 j 移动到 secondList 的下一个节点
  • minB <= minA < maxB <= maxA :此时应该将 j 移动到 secondList 的下一个节点
  • minB <= minA < maxA <= maxB :此时应该将 i 移动到 firstList 的下一个节点

按照上面的分类,实现代码:

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
        if(!firstList.size() || !secondList.size()){
            return {};
        }
        vector<vector<int>> res;
        int minA = firstList[0][0];
        int minB = secondList[0][0];
        int maxA = firstList[0][1];
        int maxB = secondList[0][1];
        int i = 0;
        int j = 0;
        while(true){
            if(minA > maxB){ // 两个区间不相交
                if(++j < secondList.size()){
                    minB = secondList[j][0];
                    maxB = secondList[j][1];
                }
                else{
                    break;
                }
            }
            else if(minB > maxA){ // 两个区间不相交
                if(++i < firstList.size()){
                    minA = firstList[i][0];
                    maxA = firstList[i][1];
                }
                else{
                    break;
                }
            }
            else if(minA >= minB){ // 两个区间相交
                if(maxA <= maxB){ // 判断哪个节点的最大值更小,最大值更小的节点需要移动至下一个节点
                    res.push_back({minA, maxA});
                    if(++i < firstList.size()){
                        minA = firstList[i][0];
                        maxA = firstList[i][1];
                    }
                    else{
                        break;
                    }
                }
                else{
                    res.push_back({minA, maxB});
                    if(++j < secondList.size()){
                        minB = secondList[j][0];
                        maxB = secondList[j][1];
                    }
                    else{
                        break;
                    }
                }
            }
            else{
                if(maxB <= maxA){
                    res.push_back({minB, maxB});
                    if(++j < secondList.size()){
                        minB = secondList[j][0];
                        maxB = secondList[j][1];
                    }
                    else{
                        break;
                    }
                }
                else{
                    res.push_back({minB, maxA});
                    if(++i < firstList.size()){
                        minA = firstList[i][0];
                        maxA = firstList[i][1];
                    }
                    else{
                        break;
                    }
                }
            }
        }
        return res;
    }
};
posted @   greatestchen  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示