首页 > 其他分享 >力扣 leetcode 986. 区间列表的交集

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

时间:2022-12-02 22:55:05浏览次数:43  
标签:firstList minA minB 986 力扣 secondList 区间 maxA leetcode

问题描述

给定两个由一些 闭区间 组成的列表,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;
    }
};

标签:firstList,minA,minB,986,力扣,secondList,区间,maxA,leetcode
From: https://www.cnblogs.com/greatestchen/p/16945923.html

相关文章

  • 力扣 leetcode 1769. 移动所有球到每个盒子所需的最小操作数
    问题描述有n个盒子。给你一个长度为n的二进制字符串boxes,其中boxes[i]的值为'0'表示第i个盒子是空的,而boxes[i]的值为'1'表示盒子里有一个小球。在......
  • #yyds干货盘点# LeetCode程序员面试金典:字符串压缩
    题目:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串......
  • 反转链表-LeetCode206 改变指向
    LeetCode链接:https://leetcode.cn/problems/reverse-linked-list/题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:    输入:head=[1,2,......
  • 力扣03 返回最大不重复子串的长度
    力扣03返回最大不重复子串的长度题目:给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符......
  • [leetcode每日一题]12.2
    ​​1769.移动所有球到每个盒子所需的最小操作数​​有 ​​n​​ 个盒子。给你一个长度为 ​​n​​ 的二进制字符串 ​​boxes​​ ,其中 ​​boxes[i]​​ 的值......
  • [LeetCode] 1769. Minimum Number of Operations to Move All Balls to Each Box
    Youhave n boxes.Youaregivenabinarystring boxes oflength n,where boxes[i] is '0' ifthe ith boxis empty,and '1' ifitcontains one ba......
  • 力扣 701. 二叉搜索树中的插入操作
    701.二叉搜索树中的插入操作给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ......
  • 力扣 700. 二叉搜索树中的搜索
    700.二叉搜索树中的搜索给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在BST中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节......
  • 力扣 669. 修剪二叉搜索树
    669.修剪二叉搜索树给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树 不应该......
  • 力扣刷题笔记 167. 两数之和 II - 输入有序数组
    问题描述给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数 target的两个数。如果设这两个数分别是numbers[ind......