📜  插入已排序且不重叠的区间数组(1)

📅  最后修改于: 2023-12-03 15:39:51.681000             🧑  作者: Mango

插入已排序且不重叠的区间数组

概述

本文将介绍如何向已排序且不重叠的区间数组中插入新的区间。

问题描述

已知一个已排序且不重叠的区间数组 intervals,其中每个区间为 [start, end] 的形式,现在需要将一个新的区间 [newStart, newEnd] 插入到该数组中,并要求插入后数组依然保持已排序且不重叠的状态。

解决方案

我们可以分两步来解决该问题:

  1. 找到新区间需要插入的位置;
  2. 将新区间插入到数组中并合并相邻重叠的区间。
找到新区间需要插入的位置

因为数组 intervals 已经是有序的且不重叠的,所以我们可以使用二分查找来找到需要插入的位置。具体地,我们可以在 intervals 中找到第一个起始位置 start 大于 newStart 的区间的下标 i,此时我们可以将新区间插入到 i 的位置。

如果 newStart 大于数组中的所有区间的起始位置,则应将新区间插入到数组的末尾。如果 newStart 小于数组中的所有区间的起始位置,则应将新区间插入到数组的开头。

示例代码:

def get_insert_index(intervals, newStart):
    n = len(intervals)
    left, right = 0, n - 1
    while left <= right:
        mid = (left + right) // 2
        if intervals[mid][0] >= newStart:
            right = mid - 1
        else:
            left = mid + 1
    return left
将新区间插入到数组中并合并相邻重叠的区间

我们将新区间插入到数组中,并对数组进行遍历。对于相邻的两个区间 currnext,如果它们重叠了,则将它们合并为一个新的区间 [curr[0], max(curr[1], next[1])] 并继续向后遍历。

注意:这里假设区间 [start1, end1] 和区间 [start2, end2] 重叠等价于区间 (start1, end1] 和区间 [start2, end2] 重叠。也就是说,区间两端的点不属于区间本身。

示例代码:

def insert(intervals, newInterval):
    res = []
    n = len(intervals)
    insert_index = get_insert_index(intervals, newInterval[0])
    intervals.insert(insert_index, newInterval)
    curr = intervals[0]
    for i in range(1, n + 1):
        if i == n or curr[1] < intervals[i][0]:
            res.append(curr)
            curr = intervals[i] if i < n else None
        else:
            curr[1] = max(curr[1], intervals[i][1])
    return res
总结

本文介绍了如何向已排序且不重叠的区间数组中插入新的区间,并要求插入后数组依然保持已排序且不重叠的状态。我们采用二分查找定位插入位置,并合并相邻重叠的区间。