给出一组区间,请合并所有重叠的区间。
例如,
给出[1,3],[2,6],[8,10],[15,18],
返回[1,6],[8,10],[15,18].
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)先将所有对象进行排序,按照start的大小从小到大排序
(2)若两个区间相交,则将这两个区间合并,去替代结果集中原来的区间
(3)若两个区间不相交,则将对象直接添加到结果集尾部
/**
* 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.lang.Math;
import java.util.*;
public class Solution {
ArrayList res = new ArrayList();
public ArrayList merge(ArrayList intervals) {
if(intervals == null || intervals.size() < 2)
return intervals;
//对所有对象按照start的大小从小到大的顺序进行排序
Collections.sort(intervals, new Comparator() {
public int compare(Interval o1, Interval o2) {
return o1.start-o2.start;
}
});
//将第一个对象加入res
res.add(intervals.get(0));
for(int i = 1; i < intervals.size() ; i++){
//获取结果集中最后一个对象区间
Interval first = res.get(res.size() - 1);
Interval second = intervals.get(i);
//区间相交
if(second.start <= first.end){
int start = Math.min(first.start, second.start);
int end = Math.max(first.end, second.end);
//合并两个区间成为新的区间,剔除原来的区间,将新区间加入到结果集中
res.remove(res.size() - 1);
res.add(new Interval(start, end));
}
//区间不相交,直接加入res
else{
res.add(second);
}
}
return res;
}
}