5.3
这个题真的写的我是要崩溃了呢。就是捋不清楚了呢。
后来的大概思路就是,确定了head和tail,也就是start和end的大概位置。
在处理头结点,分为包含在区间和不包含在区间中两种情况。
最后在处理尾节点,尾节点处理的时候要注意和后一个区间的合并,也就是那种头尾相接的情况。
这个题,啊,心身俱疲,简直了。
可能是我太笨了。
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
*/
class Solution {
/**
* Insert newInterval into intervals.
* @param intervals: Sorted interval list.
* @param newInterval: A new interval.
* @return: A new sorted interval list.
*/
public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
//ArrayList<Interval> result = new ArrayList<Interval>();
int size = intervals.size();
if(size == 0){
intervals.add(newInterval);
return intervals;
}
int head = -1,tail = -1;
//处理特殊情况,在列表首端或者尾端直接插入即可
if(intervals.get(0).start > newInterval.end){
intervals.add(0,newInterval);
return intervals;
}
if(intervals.get(size -1).end < newInterval.start){
intervals.add(newInterval);
return intervals;
}
//start 和 end 的对应位置。
for(int i = 0;i < size;i++){
Interval tmp = intervals.get(i);
/*找到了第一个大于newInterval.start值的地方
其实最好是可以找到start的区间,或者是start在这个区间之后的那个区间。
*/
if(tmp.start <= newInterval.start){
head = i;
}
/*找到了最后一个小于newInterval.end值的地方
其实最好是可以找到end的区间,或者是end在这个区间之前的那个区间
*/
if(tmp.end <= newInterval.end){
tail = i;
}
}
//处理 [[1,5],[7,8]], [6,6] 这种情况
if(newInterval.start == newInterval.end){
if(intervals.get(head).end < newInterval.start){
intervals.add(head+1,newInterval);
}
return intervals;
}
if(head < 0){
intervals.get(head + 1).start = newInterval.start;
head = head + 1;
}
if(tail < 0){
return intervals;
}
// 先处理头结点:分为两种情况
// 头结点 包含在找到的这个区间之间
Interval tmp1 = intervals.get(head);
if(tmp1.end >= newInterval.start){
if(head == intervals.size() -1){
intervals.get(head).end = Math.max(intervals.get(head).end,newInterval.end);
return intervals;
}
}
// 头结点 包含在找到的这个区间之间
else{
intervals.add(head+1,newInterval);
head++;
tail++;
}
//处理尾节点
int x = tail - head;
while(x > 0){
intervals.remove(head +1);
x--;
}
if(head + 1< intervals.size()){
if(intervals.get(head +1).start <= newInterval.end){
intervals.get(head).end = intervals.get(head +1).end;
intervals.remove(head +1);
return intervals;
}
}
intervals.get(head).end = Math.max(intervals.get(head).end,newInterval.end);
return intervals;
}
}