Files
2025-10-01 11:12:50 +08:00

87 lines
2.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 合并区间
## 题目
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
示例 3:
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
## 思路
- 排序
- 按照左下标排序
- 合并
- 条件
- [i1, j1] & [i2, j2] (i1 <= i2)的合并条件是 `j1 <= i2`
- 处理后
- `[i1, j2]`
- 注意
- 处理后获取的数组可以继续向后合并
- 操作
- 排序
- 合并列表 `List<int[]> merge = ArrayList<>()`
- 遍历二维数组
- 取出 L, R
- 列表为空
- 直接放入
- 列表不为空
- 当前与列表最后一个比较
## 代码
```java
class Solution {
public int[][] merge(int[][] intervals) {
// Special: NULL or EMPTY
if (intervals == null || intervals.length == 0) return new int[0][2];
// Init: Merged ArrayList
List<int[]> merged = new ArrayList<>();
// Sort: By Left Number
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] val1, int[] val2) {
return val1[0] - val2[0];
}
});
// Traverse
for (int i = 0; i < intervals.length; i++) {
// Get: L & R
int L = intervals[i][0];
int R = intervals[i][1];
// Merge: Add or Not
if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
merged.add(new int[]{L, R});
} else {
merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
}
}
return merged.toArray(new int[merged.size()][]);
}
}
```