这题核心就两步:先按起点排序 → 再逐个合并重叠区间
思路
-
按每个区间的左端点从小到大排序
-
用一个列表保存结果
-
遍历每个区间:
◦ 如果结果为空,直接加入
◦ 否则看当前区间起点 ≤ 最后一个区间终点 → 重叠,合并
◦ 不重叠就直接加入
完整代码实现:
java
class Solution {
public int[][] merge(int[][] intervals) {
// 边界:空数组
if (intervals == null || intervals.length == 0) {
return new int[0][];
}
// 1. 按区间的起点(第一个数)升序排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
// 保存最终合并后的区间
List<int[]> res = new ArrayList<>();
// 先把第一个区间加进去
res.add(intervals[0]);
// 2. 从第二个区间开始遍历
for(int i = 1;i<intervals.length;i++){
// 当前要处理的区间
int[] curr = intervals[i];
// 结果中最后一个已经合并的区间
int[] last = res.get(res.size() - 1);
// 当前区间起点 <= 最后区间终点 → 重叠,需要合并
if(curr[0] <= last[1]){
// 合并:起点不变,终点取两者最大值
last[1] = Math.max(curr[1],last[1]);
}else{
res.add(curr);
}
}
// 把 List 转成 int[][] 返回
return res.toArray(new int[res.size()][]);
}
}
超级好记口诀
先按起点排个序, 后一起点 ≤ 前终点就合并, 合并只改终点取最大, 不重叠就直接加。