LeetCode #57 Insert Interval

题目

Insert Interval


解题方法

插入问题首先考虑找到插入位置,对intervals[i][0]用二分查找即可,插入完成后记录下插入的位置,然后分别向两端找可以合并的区间。

向左边找时,如果intervals[i][1] >= intervals[insert_pos][0],意味着插入的区间的左端已经延伸到了此区间内部,可以进行合并,此时还要额外判断此区间的右端intervals[i][1]和插入区间右端的关系,防止此种情况出现:插入区间包含在此区间之内。合并完成后删除掉此区间,并修改insert_pos和i的值。如果intervals[i][1] < intervals[insert_pos][0],则说明已经不用再找了。

向右边找时,如果intervals[i][0] <= intervals[insert_pos][1],意味着插入区间的右端已经延伸到了此区间的内部,可以进行合并,选取两个区间右端的最大值作为新的右端,删除掉此区间即可,insert_pos和i都不要动。如果intervals[i][1] > intervals[insert_pos][0],则说明已经不用再找了。


代码

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        if not intervals:
            return [newInterval]
        
        insert_pos = 0
        left = 0
        right = len(intervals) - 1
        while left <= right:
            mid = (left + right) // 2
            if intervals[mid][0] == newInterval[0]:
                intervals.insert(mid, newInterval)
                insert_pos = mid
                break
            elif intervals[mid][0] < newInterval[0]:
                left = mid + 1
            else:
                right = mid - 1
            if left > right:
                intervals.insert(left, newInterval)
                insert_pos = left
        
        i = insert_pos - 1
        while i >= 0:
            if intervals[i][1] >= intervals[insert_pos][0]:
                intervals[insert_pos][0] = intervals[i][0]
                intervals[insert_pos][1] = max(intervals[insert_pos][1], intervals[i][1])
                intervals.pop(i)
                insert_pos -= 1
                i -= 1
            else:
                break
        
        i = insert_pos + 1
        while i < len(intervals):
            if intervals[i][0] <= intervals[insert_pos][1]:
                intervals[insert_pos][1] = max(intervals[insert_pos][1], intervals[i][1])
                intervals.pop(i)
            else:
                break
        
        return intervals
posted @ 2020-10-14 10:03  老鼠司令  阅读(60)  评论(0编辑  收藏  举报