Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
首先对区间按照区间的左端点排序。左端点相同的情况下顺序可以随意,不一定按照右端点作为第二关键字进行排序,例如排序以后生成[1,3],[1,2],[1,1],[2,6],[8,10],[15,18],合并的时候[1,2]合并到[1,3]里面,因为进行了合并操作,所以仍然会往下扫描下一个区间。
排序以后从前往后扫描,对有交叉的区间进行合并,因为排过序!最后能够合并成一个区间的所有区间一定能够在一次循环中检测到!
public List<Interval> merge(List<Interval> intervals)
{
Collections.sort(intervals,new mycomparator1());
List<Interval> retlist=new ArrayList<>();
int len=intervals.size();
boolean[] used=new boolean[len];
for(int i=0;i<len;i++)
if(!used[i])
{
used[i]=true;
Interval in1=intervals.get(i);
int newstart=in1.start;
int newend=in1.end;
for(int j=i+1;j<len;j++)
if(!used[j])
{
Interval in2=intervals.get(j);
if(in2.start<=newend)
{
newend=Math.max(newend, in2.end);
used[j]=true;
}
else {
break;
}
}
retlist.add(new Interval(newstart, newend));
}
return retlist;
}
class mycomparator1 implements Comparator<Interval>
{
@Override
public int compare(Interval o1, Interval o2)
{
if(o1.start<o2.start)
return -1;
if(o1.start>o2.start)
return 1;
return 0;
}
}
class Interval
{
int start;
int end;
Interval()
{
start = 0;
end = 0;
}
Interval(int s, int e)
{
start = s;
end = e;
}
@Override
public String toString()
{
// TODO Auto-generated method stub
return "["+start+","+end+"]";
}
}