LeetCode每日一题,57. Insert Interval
先看题目描述
大意就是给定一个无重叠的,按照区间起始端点排序的区间列表,让我们在列表中插入一个新区间,确保区间中的列表仍然有序且不重叠(可以合并区间)
算法和思路
算法流程
我们对所有的区间进行一次遍历,当遍历到区间 [l, r] 时:
- 如果 r < left,则 [l, r] 与 新区间 S 不重叠且在其左侧,我们可以直接将 [l, r] 加入答案;
- 如果 l > right,说明 [l, r] 与 S 不重叠且在其右侧,我们可以直接将 [l, r] 加入答案;
- 否则,说明 [l, r] 与 S 重叠,我们无需将 [l, r] 加入答案,此时,我们需要将 S 与 [l, r] 合并,即将 S 更新为其与 [l, r] 的并集,即执行操作 left = min(l, left),right = max(r, right)
因此当我们遇到第一个满足 l > right 的区间时,说明以后遍历到的区间不会与 S 重叠,并且它们左端点一定会大于 S 的左端点。此时我们就可以将 S 加入答案。特别地,如果不存在这样的区间,我们需要在遍历结束后,将 S 加入答案
算法源码
模拟
1 | import java.util.*; |
下面是自己实现的暴力法的代码,基本思路就是遍历然后考虑各种情况,运行效率比较低
1 | import java.util.*; |