题目描述
// 56. 合并区间
// 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] =
// [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,
// 该数组需恰好覆盖输入中的所有区间。
题解
// 排序
// 先排除特殊情况,如果intervals长度为0直接返回[[0,0]],
// 然后对intervals数组进行Arrays.sort排序,并用Comparator比较器重新定义,
// 按照子数组(区间)中的首位元素(区间左边界)来对这几个数组进行排序。
// 这样遍历区间时候,只需要看区间右边界进行比对就可以了。
//
// for从头到尾循环遍历intervals,遍历索引为i,遍历区间为intervals[i],
// 当前遍历区间的左边界为intervals[i][0],记为left,
// 当前遍历区间的右边界intervals[i][1],记为right,
// 记录结果数组为res。如果res为空,直接将当前遍历的区间作为new int[]{left, right}
// 存入res,或者如果res中最新存入的区间(res.get(res.size() - 1))的
// 右区间边界(res.get(res.size() - 1)[1])比当前遍历的区间的左边界left小,
// 说明当前遍历区间和res中最新存入的区间绝不可能有交集,
// 直接将当前遍历的区间存入res。
// else : 如果res中最新存入的区间的右区间边界(res.get(res.size() - 1)[1])
// 比当前遍历的区间的左边界left要大或者相等,说明当前遍历区间有交集,
// 由于遍历区间的左边界全是已经排好序的,所以当前遍历区间左边界left,
// 不可能比已经存入的区间的左边界还要小。我们只需要比对已存入区间右边界和
// 当前遍历区间右边界right就行了,我们直接取res最新存入区间右边界和right之间
// 的最大值,来更新已存入区间右边界的值。
// 循环结束,直接返回res.toArray(new int[res.size()][])
// 即以int[][]形式返回。
//
import java.util.Arrays;
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length == 0)
return new int[0][2];
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
List<int[]> res = new ArrayList<int[]>();
for (int i = 0; i < intervals.length; i++) {
int left = intervals[i][0];
int right = intervals[i][1];
if (res.size() == 0 || res.get(res.size() - 1)[1] < left) {
res.add(new int[]{left, right});
}
else { // res.get(res.size() - 1)[1] >= left
res.get(res.size() - 1)[1] = Math.max(res.get(res.size() - 1)[1], right);
}
}
return res.toArray(new int[res.size()][]);
}
}