56 合并区间
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new LinkedList<>();
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
int start = intervals[0][0];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] > intervals[i - 1][1]) {
res.add(new int[]{start, intervals[i - 1][1]});
start = intervals[i][0];
} else {
intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
}
}
res.add(new int[]{start, intervals[intervals.length - 1][1]});
return res.toArray(new int[res.size()][]);
}
}
思路:
- 对区间按左边界进行升序排序
- 按照前后元素比较的方式遍历区间数组,遇到当前区间的左边大于前一个区间的右边界的,说明这两个区间不重叠,可以添加到结果集。反之,遇到重叠区间的需要更新区间的最大右边界。
- 当遍历完最后一个左边界后,还需要再添加最后一次区间。
- 最后将 list 转换为二维的区间数组