30. Insert Interval【LintCode by java】
阿新 • • 發佈:2018-05-30
處理 solution lap lin def 結果 兩種 ssa ram
Description
Given a non-overlapping interval list which is sorted by start point.
Insert a new interval into it, make sure the list is still in order and non-overlapping
(merge intervals if necessary).
Example
Insert (2, 5)
into [(1,2), (5,9)]
, we get [(1,9)].
Insert (3, 4)
into [(1,2), (5,9)]
, we get [(1,2), (3,4), (5,9)]
.
題意:給定一個區間,將它插進一個有序的區間集合裏,新的區間依然要保持有序性。這就需要考慮到區間的合並問題,我們可以定義一個新的集合,來存放最後的結果。定義一個temp遊標,用一個循環從舊的集合中依次取出區間,與待插入區間進行比較。那麽如何比較呢?假定新區間的end都小於temp的start,那說明新區間比temp要小,那麽直接將新區間放進結果集合裏就行了,剩下的依次插入。不然,則說明需要進行區間的合並,具體代碼如下:
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
// write your code here
//特殊情況的討論
List<Interval>ans=new ArrayList<Interval>();
if(intervals.size()==0){
ans.add(newInterval);
return ans;
}
if(newInterval==null){
return intervals;
}
if(newInterval.start>intervals.get(intervals.size()-1).end){
intervals.add(newInterval);
return intervals;
}
//一般情況的討論
Interval last=null;
for(int i=0;i<intervals.size();i++){
//用不到newIneval
Interval temp=intervals.get(i);
if(newInterval.start>temp.end){
ans.add(temp);
continue;
}else{
//分兩種情況
if(newInterval.end<temp.start){
ans.add(newInterval);
last=temp;
}else{
int start=newInterval.start<temp.start?newInterval.start:temp.start;
int end=newInterval.end<temp.end?temp.end:newInterval.end;
//合並
last=new Interval(start,end);
}
//對剩下的進行處理
for(int j=i+1;j<intervals.size();j++){
Interval t=intervals.get(j);
if(last.end<t.start){
//歸並完成
ans.add(last);
last=t;
}else{
//繼續歸並
last.end=last.end>t.end?last.end:t.end;
}
}
ans.add(last);
break;
}
}
return ans;
}
}
30. Insert Interval【LintCode by java】