【排序 + 区间合并】排序后, 比较前一个区间的右端点和下一个区间的左端点,如果右端点ed >= 下个区间的左端点,那个就可以合并,合并后的右端点是当前ed和下一个区间的右端点取最大值;否则,说明当前这个是一个独立的区间,将其加入答案,并把st和ed设置为下一区间的左右端点,继续进行验证。
这里为了好判断边界问题,先把st和ed初始化为一个很小的数;最后不要忘记把最后一个区间也加入答案中。
class Solution {
// 48:00
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
List<int[]> list = new ArrayList();
int inf = -1, st = inf, ed = inf;
for (int[] it: intervals) {
if (ed >= it[0]) {
ed = Math.max(ed, it[1]);
} else {
if (st != inf) {
list.add(new int[] {st, ed});
}
st = it[0]; ed = it[1];
}
}
if (st != inf) list.add(new int[] {st, ed});
int[][] ans = new int[list.size()][2];
for (int i = 0; i < list.size(); i++) {
ans[i][0] = list.get(i)[0];
ans[i][1] = list.get(i)[1];
}
return ans;
}
}