Java 解算法:合并區間
題目:以數組 intervals 表示若干個區間的集合,其中單個區間為 intervals[i] = [starti, endi] 。請你合并所有重疊的區間,并返回 一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間 。
輸入:intervals = [[1,3],[2,6],[8,10],[15,18]]
輸出:[[1,6],[8,10],[15,18]]
解釋:區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6]
這個題的目標是合并所有重疊的區間。解題思路是,先把數組的元素進行排序,再合并區間。
為什么要排序呢?因為將區間按照起始元素排序,才能讓我們非常清晰地識別重疊的區間。
排序:首先,根據每個區間的起始元素對區間進行排序(按照首元素從小到大排)。
合并:然后,遍歷排序后的區間列表,檢查當前區間是否與前一個區間重疊。 如果重疊,合并這兩個區間;如果不重疊,將當前區間添加到結果列表中。
具體步驟:
-
排序:使用 Arrays.sort 方法對區間進行排序,排序的依據是每個區間的起始元素大小。
-
合并:使用一個 LinkedList 來存儲合并后的區間。遍歷排序后的區間列表,對于每個區間,檢查它是否與 LinkedList 中最后一個區間重疊。如果重疊,合并這兩個區間;如果不重疊,將當前區間添加到 LinkedList 中。
-
返回結果:將 LinkedList 轉換為數組并返回。
我的Java代碼:
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length <= 1) {
return intervals;
}
// 按照首元素對區間進行排序。 lambda 表達式定義排序的規則:首元素小的區間排在前面。
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
LinkedList<int[]> merged = new LinkedList<>();
merged.add(intervals[0]);
int length = intervals.length;
for (int i = 1; i < length; i++) {
int[] current = intervals[i];
int[] lastMerged = merged.getLast();
// 檢查當前區間是否與最后一個合并的區間重疊
if (current[0] <= lastMerged[1]) {
// 合并區間
lastMerged[1] = Math.max(lastMerged[1], current[1]);
} else {
// 不重疊,將當前區間添加到結果列表中
merged.add(current);
}
}
return merged.toArray(new int[merged.size()][]);
}
}
所有正文內容皆為本人原創,禁止搬運

浙公網安備 33010602011771號