地址:https://oj.leetcode.com/problems/insert-interval/
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]
.
/**
* 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) {
if(intervals.size()==0){
intervals.add(newInterval);
return intervals;
}
List<Interval> ans = new LinkedList<>();
Interval currentInterval;
int i;
for(i=0;i<intervals.size();i++){
currentInterval = intervals.get(i);
// 情况1:插入区间start 在currentInterval ,更新newInterval
if(newInterval.start<=currentInterval.end && newInterval.start >= currentInterval.start){
newInterval.start = currentInterval.start;
newInterval.end = Math.max(newInterval.end, currentInterval.end);
}
// 情况2:如果currentInterval小于newInterval 的start 直接添加currentInterval
if(currentInterval.end<newInterval.start){
ans.add(currentInterval);
}
// 情况3:newInterval 的end 小于currentInterval.start 则添加newInterval,跳出循环后添加intervals剩下的元素
if(newInterval.end<currentInterval.start){
ans.add(newInterval);
break;
}
// 情况4: 当newInterval的end在currentInterval区间中,更新newInterval
if(newInterval.end>=currentInterval.start && newInterval.end<=currentInterval.end){
newInterval.end = currentInterval.end;
}
}
// 这里处理情况3跳出时,添加所有intervals剩下的元素
for(int j=i;j<intervals.size();j++){
ans.add(intervals.get(j));
}
// 这里处理当newInterval 区间包含intervals中所有区间,在上面四种情况之外,这里单独处理
if(i==intervals.size()){
ans.add(newInterval);
}
return ans;
}
}