LeetCode 57 - 插入区间

题目描述
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 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] 重叠。

解法:
分两个步骤来考虑:

  1. 先把插入区间那在手上,把在插入区间之前的区间放入到输出中;
  2. 把插入区间放入输出中(如果存在重叠则进行合并),之后再将还未放入的区间逐个放入到输出中,如果包含在插入区间中则忽略,如果和插入区间存在重叠则进行合并。
class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        new_start, new_end = newInterval
        idx, n = 0, len(intervals)
        output = []

        while idx < n and new_start > intervals[idx][0]:
            output.append(intervals[idx])
            idx += 1

        if not output or output[-1][1] < new_start:
            output.append(newInterval)
        else:
            output[-1][1] = max(output[-1][1], new_end)

        while idx < n:
            interval = intervals[idx]
            start, end = interval
            idx += 1
            if output[-1][1] < start:
                output.append(interval)
            else:
                output[-1][1] = max(output[-1][1], end)
        
        return output 

此题涉及贪心算法,下面做出简单介绍:

贪心算法一般用来解决需要 “找到要做某事的最小数量”“找到在某些情况下适合的最大物品数量” 的问题,且提供的是无序的输入。

贪心算法的思想是每一步都选择最佳解决方案,最终获得全局最佳的解决方案。

标准解决方案具有 O ( N log N ) \mathcal{O}(N \log N)
O ( N l o g N ) \mathcal O(NlogN) 的时间复杂度且由以下两部分组成:

  1. 思考如何排序输入数据( O ( N log N ) \mathcal{O}(N \log N) 的时间复杂度)。
  2. 思考如何解析排序后的数据( O ( N ) \mathcal{O}(N) 的时间复杂度)

如果输入数据本身有序,则我们不需要进行排序,那么该贪心算法具有 O ( N ) \mathcal{O}(N) 的时间复杂度。

参考:https://leetcode-cn.com/problems/insert-interval/solution/cha-ru-qu-jian-by-leetcode/

发布了55 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38204302/article/details/104278767