LeeCode 57. Insert Interval

简介: 给定一组非重叠间隔,在间隔中插入新间隔(必要时合并)。您可以假设间隔最初是根据其开始时间排序的。

v2-ce59f8586ff3e579839fb7a7c8df4317_1440w.jpg


Description


Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).


You may assume that the intervals were initially sorted according to their start times.


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: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].


描述



给定一组非重叠间隔,在间隔中插入新间隔(必要时合并)。

您可以假设间隔最初是根据其开始时间排序的。


思路



  • 这一道题是第五十六题Merge Intervals的演变,所以解题思路非常相似,只是多了一步插入而已,第五十六题在这里,解析在这里.
  • 这道题是要求向已经按起始位置排好序的区间中插入一个新区间,如果插入导致了区间有重叠则需要合并区间
  • 因此思路如下
  1. 找到原始区间中 第一个 区间起始位置大于需要插入区间 的区间
  2. 在此位置插入区间
  3. 对重叠的区间进行合并:检查当前区间起始位置是否在上一个区间之间,若是:检查当前区间的结束位置是否大于上一个区间,如果大于则更新上一个区间的结束位置,然后删除当前区间;如果没有在上一个区间之间,则什么也不做,继续判断下一个区间


class Interval:
    def __init__(self, s=0, e=0):
        self.start = s
        self.end = e
class Solution:
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        # 如果intervals为空,则直接返回newInterval,注意返回的形式为数组
        if not intervals:
            return [newInterval]
        # 初始化i表示起始索引,count表示intervals中的个数
        i, count = 0, len(intervals)
        # 找到intervals中第一个start值比newInterval大的位置
        while i < count and newInterval.start > intervals[i].start:
            i += 1
        # 在此位置插入
        intervals.insert(i, newInterval)
        # count总数加一
        count += 1
        i = 1
        while i < count:
            # 如果当前位置的区间起始位置在上一个区间之间
            if intervals[i-1].start <= intervals[i].start <= intervals[i-1].end:
                # 如果当前位置区间的结束大于上一个区间,则更新上一个区间的结束位置
                if intervals[i].end > intervals[i-1].end:
                    intervals[i-1].end = intervals[i].end
                # 删除当前的区间
                del intervals[i]
                # 区间总数减一
                count -= 1
                # 索引减一
                i -= 1
            i += 1
        return intervals


源代码文件在这里.

目录
相关文章
|
应用服务中间件 C++ AHAS
hdu1327 Definite Values
hdu1327 Definite Values
50 0
|
JavaScript 索引
LeetCode 436. Find Right Interval
Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.
82 0
LeetCode 436. Find Right Interval
LeetCode contest 177 5169. 日期之间隔几天 Number of Days Between Two Dates
LeetCode contest 177 5169. 日期之间隔几天 Number of Days Between Two Dates