// 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].
假设输入的原先区间是有序的
答案:
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
int i = 0;
while(i < intervals.size() && intervals.get(i).end < newInterval.start) i++;//如果列表的第一个区间得最后一个值比新区间第一个值要小,则i++
while(i < intervals.size() && intervals.get(i).start <= newInterval.end) {//如果区间的开始小于新区间的最后
newInterval = new Interval(Math.min(intervals.get(i).start, newInterval.start), Math.max(intervals.get(i).end, newInterval.end));//取当前区间和新区间的最小开始,和最大结束
intervals.remove(i);//原先的区间去除
}
intervals.add(i, newInterval);//添加新的区间
return intervals;
}
}
代码解析:抓住题目的业务逻辑信息,写出代码来并不难.
核心思想:遍历原先列的所有区间,取当前区间和新区间的最小开始,和最大结束
核心代码:
while(i < intervals.size() && intervals.get(i).start <= newInterval.end) {//如果区间的开始小于新区间的最后
newInterval = new Interval(Math.min(intervals.get(i).start, newInterval.start), Math.max(intervals.get(i).end, newInterval.end));//取当前区间和新区间的最小开始,和最大结束
intervals.remove(i);//原先的区间去除
}