Link: https://oj.leetcode.com/problems/insert-interval/
This Q seems easy, but I didn't complete the code.
The difficulty: I don't know how to deal when the newInterval's end < intervals.get(0).start
Approach I: Create a new ArrayList
Time: 0(n) Space: O(1) //结果集的空间不算
Note: When newInterval.end < interval.start: we put newInterval into result, and replace newInterval with current one.
public class Solution {
public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
ArrayList<Interval> result = new ArrayList<Interval>();
int i = 0;
for(Interval interval : intervals){
if(newInterval.end < interval.start){
result.add(newInterval);
newInterval = interval;//since newInterval has been saved, deal with the original intervals
}
else if(interval.end < newInterval.start){
result.add(interval);
}
else{
newInterval.start = Math.min(interval.start, newInterval.start);
newInterval.end = Math.max(interval.end, newInterval.end);
}
}
result.add(newInterval);
return result;
}
}
Approach II: Use Iterator
Time: O(n), Space: O(1)
public class Solution {
public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
ListIterator<Interval> it = intervals.listIterator();
while(it.hasNext()){
Interval interval = it.next();
if(newInterval.end < interval.start){//找到插入点
it.previous(); //must use ListIterator to traverse backwards
it.add(newInterval);
return intervals;//can stop traversing
}
else if(interval.end < newInterval.start){//还没有overlap
continue;
}
else{//overlap了,更新被插入的Interval,删除原来的(因为已经被用过)
newInterval.start = Math.min(interval.start, newInterval.start);
newInterval.end = Math.max(interval.end, newInterval.end);
it.remove();//why?
}
}
intervals.add(newInterval);
return intervals;
}
}