1 今日打卡
合并区间 56. 合并区间 – 力扣(LeetCode)
单调递增的数字 738. 单调递增的数字 – 力扣(LeetCode)
2 合并区间
2.1 思路
1. 排序(基础前提) 操作:将所有区间按照「区间起始值」进行升序排序。 目的:排序后,所有可能重叠的区间会被排列在一起,只需从左到右遍历一次即可完成合并,无需回头检查前面的区间,这是线性遍历的基础。 举例:输入 [[3,5],[1,4],[2,6]],排序后变为 [[1,4],[2,6],[3,5]],重叠区间集中排列,便于后续处理。
2. 遍历合并(核心逻辑) 初始化:用两个变量 start 和 end 记录当前正在合并的区间的「起始值」和「结束值」,初始化为第一个区间的起始和结束。 遍历规则(从第二个区间开始):
情况 1:无重叠:如果当前区间的起始值 > 已合并区间的 end(比如当前合并区间是 [1,4],遍历到 [5,7]),说明两个区间不重叠。 把当前合并好的区间 [start, end] 加入结果列表; 更新 start 和 end 为当前遍历到的区间的起始、结束值,开始处理下一个待合并区间。
情况 2:有重叠 / 相邻:如果当前区间的起始值 ≤ 已合并区间的 end(比如当前合并区间是 [1,4],遍历到 [2,6]),说明需要合并。 仅更新 end 为「当前合并区间的 end」和「当前遍历区间的 end」中的最大值(比如 [1,4] 和 [2,6] 合并后,end 取 6); start 保持不变,继续遍历下一个区间。
3. 收尾处理(边界补充) 遍历结束后,最后一个正在合并的区间 [start, end] 还未加入结果列表,需要手动添加。 额外处理空输入:如果输入区间数组为空,直接返回空数组,避免数组越界异常。
2.2 实现代码
class Solution {
public int[][] merge(int[][] intervals) {
// 处理空输入的边界情况(避免数组越界)
if (intervals == null || intervals.length == 0) {
return new int[0][2];
}
List<int[]> res = new ArrayList<>();
// 按区间的起始值升序排序
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
// 初始化当前合并区间的起始和结束值
int start = intervals[0][0];
int end = intervals[0][1];
// 从第二个区间开始遍历
for (int i = 1; i < intervals.length; i++) {
// 核心修正:用当前区间的起始值和已合并区间的end比较
if (intervals[i][0] > end) {
// 无重叠:将当前合并好的区间加入结果
res.add(new int[]{start, end});
// 更新为新的待合并区间
start = intervals[i][0];
end = intervals[i][1];
} else {
// 有重叠:合并区间,更新end为两者的最大值
end = Math.max(end, intervals[i][1]);
}
}
// 把最后一个合并好的区间加入结果
res.add(new int[]{start, end});
// 转换为二维数组返回
return res.toArray(new int[res.size()][2]);
}
}





