发布于 2016-01-03 01:35:22 | 198 次阅读 | 评论: 0 | 来源: PHPERZ
Leetcode 在线编程网站
leetcode 是一个美国的在线编程网站,上面主要收集了各大IT公司的笔试面试题,对于应届毕业生找工作是一个不可多得的好帮手。
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:
Given intervals[1,3],[6,9]
, insert and merge[2,5]
in as[1,5],[6,9]
.Example 2:
Given[1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge[4,9]
in as[1,2],[3,10],[12,16]
.This is because the new interval
[4,9]
overlaps with[3,5],[6,7],[8,10]
.
这道题一眼看过去思路很简单,但是一遍无bug并不容易,注意别越界,然后分别找到插入的区间左右边界分别插到哪个区间即可。
time: O(n), space: O(1)
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> res = new ArrayList<>();
int i = 0;
// 没有重叠的区间,直接添加
while (i < intervals.size() && intervals.get(i).end < newInterval.start) {
res.add(intervals.get(i++));
}
// 对于有重叠的区间,更新start
if (i < intervals.size())
newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
// 对于插入的区间能够覆盖的区间,直接跳过
while (i < intervals.size() && intervals.get(i).start <= newInterval.end) {
i++;
}
// 更新插入区间的end
if (i - 1 >= 0) {
newInterval.end = Math.max(newInterval.end, intervals.get(i - 1).end);
}
res.add(newInterval); // 添加更新后的插入区间
// 继续添加剩下不受影响的区间
while (i < intervals.size()) {
res.add(intervals.get(i++));
}
return res;
}
}