80.插入区间 (LeetCode 57)

插入区间 (LeetCode 57)

题目描述

给定一个无重叠且按起始端点排序的区间列表,插入一个新的区间,确保插入后的区间列表仍然有序且无重叠。

示例

  1. 示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
  1. 示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8][3,5],[6,7],[8,10] 重叠。

提示

  • 定位插入位置:遍历原区间列表,找到第一个结束位置 >= 新区间起始位置的区间

  • 合并重叠区间:继续向后遍历,直到遇到起始位置 > 新区间结束位置的区间

  • 拼接结果:将未处理的前半部分 + 合并后的新区间 + 未处理的后半部分组合

code

/**
 * @param {number[][]} intervals
 * @param {number[]} newInterval
 * @return {number[][]}
 */
var insert = function (intervals, newInterval) {
  // 请在此处编写代码
};

参考答案

DETAILS
function insert(intervals, newInterval) {
  const res = [];
  let i = 0;
  const n = intervals.length;

  // 添加所有结束位置 < newInterval起始位置的区间
  while (i < n && intervals[i][1] < newInterval[0]) {
    res.push(intervals[i++]);
  }

  // 合并重叠区间
  while (i < n && intervals[i][0] <= newInterval[1]) {
    newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
    newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
    i++;
  }
  res.push(newInterval);

  // 添加剩余区间
  while (i < n) {
    res.push(intervals[i++]);
  }

  return res;
}
最后更新时间' 2025/3/9 18:24:05