题目描述
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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] 重叠。
解法:
分两个步骤来考虑:
- 先把插入区间那在手上,把在插入区间之前的区间放入到输出中;
- 把插入区间放入输出中(如果存在重叠则进行合并),之后再将还未放入的区间逐个放入到输出中,如果包含在插入区间中则忽略,如果和插入区间存在重叠则进行合并。
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(NlogN)
O
(
N
l
o
g
N
)
\mathcal O(NlogN)
O(NlogN) 的时间复杂度且由以下两部分组成:
- 思考如何排序输入数据( O ( N log N ) \mathcal{O}(N \log N) O(NlogN) 的时间复杂度)。
- 思考如何解析排序后的数据( O ( N ) \mathcal{O}(N) O(N) 的时间复杂度)
如果输入数据本身有序,则我们不需要进行排序,那么该贪心算法具有 O ( N ) \mathcal{O}(N) O(N) 的时间复杂度。
参考:https://leetcode-cn.com/problems/insert-interval/solution/cha-ru-qu-jian-by-leetcode/