问题原始链接 https://leetcode.com/problems/insert-interval
给定一个没有重叠的区间集合,插入一个新的区间,如果有重叠则进行合并。
你可以假设区间已经按起始值排序。
例1:给定区间 [1,3],[6,9],插入 [2,5] 并合并后,[1,5],[6,9]。
例2:给定区间 [1,2],[3,5],[6,7],[8,10],[12,16],插入 [4,9] 并合并后,[1,2],[3,10],[12,16]。
思路:扫描区间集合,把结束值比新区间起始值小的区间加入结果集。然后把新区间加入结果集。接着继续扫描区间集合,把与新区间重叠的区间合并到新区间。最后把剩余的与新区间不重叠的区间加入到结果集。
/**
* 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) {
List<Interval> result = new ArrayList<Interval>();
if (intervals.isEmpty()) {
result.add(newInterval);
return result;
}
int i = 0;
while (i < intervals.size() && newInterval.start > intervals.get(i).end) {
result.add(intervals.get(i));
i++;
}
result.add(newInterval);
while (i < intervals.size() && overlap(newInterval, intervals.get(i))) {
Interval interval = intervals.get(i);
newInterval.start = Math.min(newInterval.start, interval.start);
newInterval.end = Math.max(newInterval.end, interval.end);
i++;
}
while (i < intervals.size()) {
result.add(intervals.get(i));
i++;
}
return result;
}
private static boolean overlap(Interval i1, Interval i2) {
return i1.start >= i2.start && i1.start <= i2.end || i2.start >= i1.start
&& i2.start <= i1.end;
}
}