题目描述:
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].
思路解析:
- 题意:将重叠的数组合并起来
- 我们首先要做的就是给区间集排序,由于我们要排序的是个结构体,所以我们要定义自己的comparator,才能用sort来排序
- 改写一个比较器:两个对象相等时,返回0;第一个大于第二个时,返回正值,否则返回负值。
- 先按照Interval的start排序,然后只要挨个比较第一个的end是不是比第二个的end大,就可以判定是否重叠了。
- 重叠的话,重新建立一个Interval,新的start是第一个的start,新的end的值是两个的end的最大值。
- 不重叠的话,就将前一个放入result中,注意跳出循环时,要记得把最后一个prev加入到result中。
代码:
/**
* 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; }
* }
*/
import java.util.*;
public class Solution {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
ArrayList<Interval> result = new ArrayList<Interval>();
if(intervals == null || intervals.size()==0)
return result;
Collections.sort(intervals,new IntervalComparator());
Interval prev = intervals.get(0);
for(int i=1;i<intervals.size();i++){
Interval curr = intervals.get(i);
if(prev.end>=curr.start){
Interval temp =new Interval(prev.start,Math.max(prev.end,curr.end));
prev = temp;
}else{
result.add(prev);
prev = curr;
}
}
result.add(prev);
return result;
}
}
class IntervalComparator implements Comparator<Interval>{
public int compare(Interval s1,Interval s2){
return s1.start-s2.start;
}
}