嘿嘿,又到了我們來挑戰 Leetcode 的時候啦!
今天我們要處理的題目是 Merge Intervals,光聽名字就覺得像在玩拼圖一樣,把重疊的區間合併在一起,最後讓每個區間都乖乖待在它應該待的地方。
不管是時間管理大師還是日常手忙腳亂的小伙伴,這題都超實用!
想想看,我們常常需要安排各種會議時間、處理日程衝突,這題的思路可是可以直接搬到生活中的。
讓我們輕鬆搞懂怎麼合併區間,然後炫技給老闆、同事看,讓他們驚呼:原來寫程式可以這麼酷!
這題不難,唯一需要注意的是合併區間的判斷邏輯,別擔心,我們會一步一步來!來吧,一起合併這些討人厭的重疊區間,讓我們的程式碼變得整齊又有條理!😎
Given an array of intervals
where intervals[i] = [starti, endi]
, merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
給定一個由多個區間組成的陣列 intervals
,其中 intervals[i] = [starti, endi]
,將所有重疊的區間合併,並返回一個不重疊的區間陣列,覆蓋輸入中的所有區間。
Example 1:
Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlap, merge them into [1,6].
說明: 因為區間 [1,3] 和 [2,6] 重疊,合併為 [1,6]。
Example 2:
Input: intervals = [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
說明: 區間 [1,4] 和 [4,5] 被認為是重疊的。
這題的關鍵在於理解區間如何合併。
合併區間需要按照區間的開始位置進行排序,然後逐一合併有重疊的區間。
如果目前的區間和上次儲存的區間有重疊,我們就合併它們,否則將目前的區間加入結果中。
function merge(intervals: number[][]): number[][] {
// 步驟 1:根據開始時間對區間進行排序
intervals.sort((a, b) => a[0] - b[0]);
// 步驟 2:初始化一個陣列來存放合併後的區間
const merged: number[][] = [];
// 步驟 3:遍歷每個區間
for (const interval of intervals) {
// 如果 merged 為空或當前區間不重疊,則將其加入
if (merged.length === 0 || merged[merged.length - 1][1] < interval[0]) {
merged.push(interval);
continue;
}
// 如果有重疊,合併區間
merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], interval[1]);
}
return merged;
}
// 使用範例
console.log(merge([[1,3],[2,6],[8,10],[15,18]])); // 輸出: [[1,6],[8,10],[15,18]]
console.log(merge([[1,4],[4,5]])); // 輸出: [[1,5]]
首先,我們先將所有區間按照開始時間排序,這樣可以讓我們在遍歷的時候很輕鬆地判斷區間是否重疊。
接著,使用一個結果陣列來儲存合併後的區間,並逐一比對每個區間。
如果目前的區間和結果陣列中的最後一個區間不重疊,就直接加入;否則,就更新結果陣列最後一個區間的結束時間為兩者中的最大值,這樣就能達到合併的效果。
這樣的方式不僅清楚簡潔,並且在面試中也經常被問到,記住這個思路,下次面對類似的問題就不會手忙腳亂啦!
是不是超級酷呢?!⸜(ˊᗜˋ)⸝