插入区间
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。
合并区间
给出的区间列表 => 合并后的区间列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
插入区间可以认为是对无序区间列的合并操作
有序区间序列的合并
区间按照左端点排序
遍历全部有序区间
[1, 3] ,添加区间,start = 1,end = 3
[2, 6],发现2是小于end的,说明当前这个区间和前面的是连续区间,所以start值不用变,只需要更新end值,end = 6。
[8, 10],发现8比6大,所以当前这个区间和前面的区间是不连续的,第一区间添加完成,添加第二区间,start = 8和end = 10
如此循环
很容易发现,只需要按照区间序列遍历全部区间,循环内根据不同情况用if处理就行了
区间插入及合并
在合并区间的基础上,先对区间序列进行排序然后进行合并即可
Foreach用法
foreach的语句格式:
for(ElementType item : Element){
/Do something/
}
/**
* 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>();
// write your code here
if(intervals.size() == 0)
{
result.add(newInterval);
return result;
}
//先排序
intervals.add(newInterval);
Collections.sort(intervals,new Comparator<Interval>(){
@Override
public int compare(Interval o1,Interval o2){
return o1.start - o2.start;
}
});
//选取区间
Interval prev = null;
for (Interval item : intervals) {
if (prev == null || prev.end < item.start) {
System.out.println(item.start);
System.out.println(item.end);
result.add(item);
prev = item; //指向同一对象
} else if (prev.end < item.end) {
prev.end = item.end; //更改区间尾
}
}
return result;
}
}