力扣 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 <= start_i < end_i <= 10^9\)
  • \(end_i < start_{i+1}\)
  • \(0 <= start_j < end_j <= 10^9\)
  • \(end_j < start_{j+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 @ 2022-12-02 22:50  greatestchen  阅读(22)  评论(0编辑  收藏  举报