思路很简单,首先对输入list排序,使其内数据按照start的大小从小到大排列。 此时当一个区间能够插入的时候,该区间的start肯定要小于当前区间的end,否则该区间和该区间之后的区间都不可插入(因为按照start上升排列),故当前区间可以插入结果列表。 利用这一思想动态更新当前区间并判断插入即可。 需要注意的是
1. Java 要对ArrayList排序,利用Collection.sort()方法,还需要重写Comparator类的compare(Object o1,Object o2)方法;而c++只需重写sort的cmp方法即可
2. 向结果的ArrayList插入Interval时要插入一个新生成的对象,否则对插入对象的修改也会直接改变结果列表中插入的结果的值(ArrayList常插入int会忽视这点)
/**
* 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 ArrayList<Interval> merge(ArrayList<Interval> intervals) {
ArrayList<Interval> res = new ArrayList<Interval>();
if( intervals == null || intervals.size()==0 )
{
return res;
}
Interval tmp = new Interval(-1,-1);
Collections.sort(intervals, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((Interval)o1).start-((Interval)o2).start;
}
});
for( Interval it : intervals )
{
if( tmp.start==-1 && tmp.end==-1 )
{
tmp.start = it.start;
tmp.end = it.end;
}
else
{
if( it.start > tmp.end )
{
res.add(new Interval(tmp.start,tmp.end));
tmp.start = it.start;
tmp.end = it.end;
}
else
{
tmp.start = Math.min(tmp.start,it.start);
tmp.end = Math.max(tmp.end,it.end);
}
}
}
res.add(tmp);
return res;
}
}