题目详情
核心解法:排序 + 线性扫描
该方法首先将区间按左端点排序。排序后,可以合并的区间会连续排列,方便我们顺序处理,从而将问题的时间复杂度主要消耗在排序上,之后的合并操作只需线性时间。
算法步骤
- 排序:将区间集合按每个区间的左边界升序排序。
- 初始化:创建一个结果列表(如 merged),先将第一个排序后的区间加入。
- 遍历与合并:从第二个区间开始遍历:
-
当前区间左边界 > 结果集最后一个区间的右边界:说明无重叠,直接将当前区间加入结果集。
-
当前区间左边界 ≤ 结果集最后一个区间的右边界:说明有重叠,更新结果集最后一个区间的右边界为其与当前区间右边界的最大值(即合并区间)。
-
Java 代码实现
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] i1, int[] i2) {
return i1[0] - i2[0];
}
});
List<int[]> merged = new ArrayList<>();
for (int[] i : intervals) {
if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < i[0]) {
merged.add(new int[] {i[0], i[1]});
} else {
merged.get(merged.size() - 1)[1] = Math.max(i[1], merged.get(merged.size() - 1)[1]);
}
}
return merged.toArray(new int[merged.size()][]);
}
}
复杂度分析
时间复杂度:O(n log n),主要来自排序。
空间复杂度:O(log n) 或 O(n),取决于排序算法和存储结果的空间。
总结
首选排序法:思路清晰,代码简洁,效率高。
理解按左端点排序如何使问题简化。
掌握合并条件的判断:当前区间左端点 <= 上一个区间右端点。
记得合并时取右端点的最大值。
221

被折叠的 条评论
为什么被折叠?



