思路:
- 构造一个比较器,用于对原始的区间数组 intervals 进行排序。区间类Interval 之间进行比较,start 小排前面,大排后面,相等的话,比较 end。end 小排前面,大排后面,相等返回 0。
- 成功构造一个比较器后,我们就对原始的区间数组 intervals 进行排序。
- 排完序后,我们取出数组中的第一个区间作为原始区间,然后遍历数组中剩下的区间,比较过程如下:
- 如果当前区间的 end 小于从数组中取出区间的 start 值时,意味着无法再进行区间的合并。将当前区间添加到结果集中,同时,当前区间更新为此时从数组中取出的那个区间
- 如果当前区间的 end 大于等于从数组中取出区间的 start 值时,意味着可以进行区间合并,此时又分为两种情况
- 如果当前区间的 end 大于等于从数组中取出区间的 end 值时,不做任何处理。(因为当前区间已经包含了取出的区间)
- 如果当前区间的 end 小于从数组中取出区间的 end 值时,更新当前区间的 end 值即可。
- 最终,我们得到了系统要的结果。
import java.util.*;
/**
* 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 class ComparaInterval implements Comparator<Interval> {
@Override
public int compare(Interval interval1, Interval interval2) {
if (interval1.start < interval2.start) {
return -1;
}
else if (interval1.start > interval2.start) {
return 1;
}
else {
if (interval1.end < interval2.end) {
return -1;
}
else if (interval1.end > interval2.end) {
return 1;
}
else {
return 0;
}
}
}
}
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals.size() < 2) {
return intervals;
}
intervals.sort(new ComparaInterval());
ArrayList<Interval> arrayList = new ArrayList<>();
Interval interval = intervals.get(0);
intervals.remove(0);
for (Interval tmpInterval : intervals) {
if (tmpInterval.start > interval.end) {
arrayList.add(interval);
interval = tmpInterval;
}
else {
if (interval.end >= tmpInterval.end) {
}
else {
interval.end = tmpInterval.end;
}
}
}
arrayList.add(interval);
arrayList.sort(new ComparaInterval());
return arrayList;
}
}