【LeetCode 面试经典150题】57. Insert Interval 插入区间

该篇文章介绍了一种算法,如何在已按起始位置升序排列的非重叠区间数组中插入一个新的区间,并保持数组有序且无重叠。通过比较和合并操作,确保插入后的新区间列表满足条件。
摘要由CSDN通过智能技术生成

57. Insert Interval

题目大意

You are given an array of non-overlapping intervals intervals where intervals[i] = [starti, endi] represent the start and the end of the ith interval and intervals is sorted in ascending order by starti. You are also given an interval newInterval = [start, end] that represents the start and end of another interval.

Insert newInterval into intervals such that intervals is still sorted in ascending order by starti and intervals still does not have any overlapping intervals (merge overlapping intervals if necessary).

Return intervals after the insertion.

中文释义

给你一个由非重叠的区间组成的数组 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,且 intervals 按照 starti 升序排序。你还会得到另一个区间 newInterval = [start, end]

newInterval 插入到 intervals 中,使得 intervals 仍然按 starti 升序排序,并且 intervals 中没有重叠的区间(如果必要,合并重叠的区间)。

返回插入后的 intervals

示例

Example 1:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]

Example 2:

Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: 因为新区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

限制条件

  • 0 <= intervals.length <= 10^4
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 10^5
  • intervalsstarti 升序排序。
  • newInterval.length == 2
  • 0 <= start <= end <= 10^5

解题思路

方法

这个解决方案用于解决 “57. Insert Interval” 问题,即在一个按起始位置升序排列的非重叠区间数组 intervals 中插入一个新区间 newInterval,并返回合并后的区间列表。解法涉及在合适的位置插入新区间,并合并所有重叠的区间。

  1. 添加新区间之前的区间

    • 初始化一个空的结果数组 result
    • 遍历 intervals,将所有结束位置小于 newInterval 起始位置的区间添加到 result 中。
  2. 合并重叠区间

    • 继续遍历 intervals,对于每个与 newInterval 重叠的区间(即起始位置小于等于 newInterval 的结束位置的区间):
      • 更新 newInterval 的起始位置为当前区间和 newInterval 起始位置的最小值。
      • 更新 newInterval 的结束位置为当前区间和 newInterval 结束位置的最大值。
  3. 添加合并后的新区间

    • 将更新后的 newInterval 添加到 result 中。
  4. 添加新区间之后的区间

    • 继续遍历 intervals,将剩余的区间添加到 result 中。
  5. 返回结果

    • 返回合并后的区间列表 result

代码

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> result;
        int i = 0, n = intervals.size();

        while (i < n && intervals[i][1] < newInterval[0]) {
            result.push_back(intervals[i]);
            i++;
        }

        while (i < n && intervals[i][0] <= newInterval[1]) {
            newInterval[0] = min(newInterval[0], intervals[i][0]);
            newInterval[1] = max(newInterval[1], intervals[i][1]);
            i++;
        }
        result.push_back(newInterval);

        while (i < n) {
            result.push_back(intervals[i]);
            i++;
        }

        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值