一、问题描述:
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]
.
二、解决思路:
针对间隔,按照start从小到大排序。(重写了sort方法)
设置标记min和max, 初始的时候min是第一个interval的start, max 是第一个interval的end.
遍历:
如果下一个interval p 的start 大于max, 说明没有重合的部分,此时[min, max] 成为第一个合并的Interval. 并且把min 置为 p的start, max 置为 p的end。
如果下一个interval p 的start 小于max,说明此时重合了, 更新max 为 max 和 p.end 中较大的一个。
注意在遍历到最后的时候要把最后的[min, max] 合并为新的Interval加入list
三、代码:
/**
* 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 List<Interval> merge(List<Interval> intervals) {
int n = intervals.size();
List<Interval> re = new ArrayList<Interval>();
if (n == 0) {
return re;
}
if (n == 1) {
re.add(intervals.get(0));
return re;
}
// sort
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval o1, Interval o2) {
if (o1.start > o2.start) {
return 1;
}
if (o1.start == o2.start) {
return 0;
}
return -1;
}
});
int min = intervals.get(0).start;
int max = intervals.get(0).end;
for (int i = 1; i < n; i++) {
Interval t = intervals.get(i);
if (t.start > max) {
Interval tmp = new Interval(min, max);
re.add(tmp);
min = t.start;
max = t.end;
} else {
max = max > t.end ? max : t.end;
}
}
Interval tmp = new Interval(min, max);
re.add(tmp);
return re;
}
}