iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

https://ithelp.ithome.com.tw/upload/images/20240920/20124462DSj3lyN2Lo.png

嘿嘿,又到了我們來挑戰 Leetcode 的時候啦!
今天我們要處理的題目是 Merge Intervals,光聽名字就覺得像在玩拼圖一樣,把重疊的區間合併在一起,最後讓每個區間都乖乖待在它應該待的地方。

不管是時間管理大師還是日常手忙腳亂的小伙伴,這題都超實用!
想想看,我們常常需要安排各種會議時間、處理日程衝突,這題的思路可是可以直接搬到生活中的。

讓我們輕鬆搞懂怎麼合併區間,然後炫技給老闆、同事看,讓他們驚呼:原來寫程式可以這麼酷!

這題不難,唯一需要注意的是合併區間的判斷邏輯,別擔心,我們會一步一步來!來吧,一起合併這些討人厭的重疊區間,讓我們的程式碼變得整齊又有條理!😎

英文題目 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]]

解題脈絡:

https://ithelp.ithome.com.tw/upload/images/20240920/20124462qc3N4hgF4p.png

首先,我們先將所有區間按照開始時間排序,這樣可以讓我們在遍歷的時候很輕鬆地判斷區間是否重疊。
接著,使用一個結果陣列來儲存合併後的區間,並逐一比對每個區間。

如果目前的區間和結果陣列中的最後一個區間不重疊,就直接加入;否則,就更新結果陣列最後一個區間的結束時間為兩者中的最大值,這樣就能達到合併的效果。

本次要點:

  1. 排序: 將區間按照開始時間排序是這題解決的核心步驟之一。
  2. 合併邏輯: 檢查是否有重疊,然後更新合併的結束時間。
  3. 邊界情況: 確保結果陣列為空或當前區間不重疊的情況下進行正確處理。

這樣的方式不僅清楚簡潔,並且在面試中也經常被問到,記住這個思路,下次面對類似的問題就不會手忙腳亂啦!
是不是超級酷呢?!⸜(ˊᗜˋ)⸝


上一篇
Day05 X Leetcode:只出現一次的數字 Single Number
下一篇
Day07 X Leetcode:旋轉圖像 Rotate Image
系列文
TypeScript X Leetcode:精進演算法,掌握技術詞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言