56. 合并区间
解题思路:先将intervals数组按左边界从小到大排序,要是下一个区间的左边界小于或等于区间的右边界,说明这两个区间可以合并成一个区间,同时更新右边界的值为两个右边界中的最大值,比如[1,5],[2,3],[4,5]可以合并成[1,5]。先将[1,5],[2,3]合并成[1,5],再合并[4,5]为[1,5]。
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new ArrayList<>();
// 按左边界从小到大排序
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
int left = intervals[0][0];
int right = intervals[0][1];
for (int i = 1; i < intervals.length; i ++) {
// 如果左边界的值小于最大右边界的值,说明区间可以合并,同时更新最大右边界的值
if (intervals[i][0] <= right) {
right = Math.max(right, intervals[i][1]);
}
// 否则,加入结果集,同时初始化left,right
else {
res.add(new int[]{left, right});
left = intervals[i][0];
right = intervals[i][1];
}
}
// 加入最后一个的合并区间
res.add(new int[]{left, right});
return res.toArray(new int[res.size()][]);
}
}
class Solution {
public static int[][] merge(int[][] intervals) {
List<int[]> res = new ArrayList<>();
// 按左边界从小到大排序
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
// 先加入一个区间,再判断下一个区间是否可以合并
res.add(intervals[0]);
for (int i = 1; i < intervals.length; i ++) {
// 如果左边界小于或等于最大右边界,说明可以合并区间,同时更新最大右边界的值
if (res.get(res.size() - 1)[1] >= intervals[i][0]) {
res.get(res.size() - 1)[1] = Math.max(res.get(res.size() - 1)[1], intervals[i][1]);
} else {
res.add(intervals[i]);
}
}
return res.toArray(new int[res.size()][]);
}
}