問題
以數組 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] 可被視為重疊區間。
思路
合并重疊區間的問題可以通過排序和遍歷的方法來解決。以下是解決這個問題的步驟:1、排序:首先,根據區間的起始點對區間進行排序。
2、初始化:創建一個新的列表 merged 來存儲合并后的區間,初始化時可以添加排序后的第一個區間。
3、遍歷:遍歷排序后的區間列表,對于每個區間,檢查它是否與 merged 列表中的最后一個區間重疊。如果重疊,將兩個區間合并;如果不重疊,將當前區間添加到 merged 列表中。
4、合并邏輯:如果當前區間的起始點小于或等于 merged 列表中最后一個區間的結束點,則合并這兩個區間,即將 merged 列表中最后一個區間的結束點更新為當前區間的結束點和 merged 列表中最后一個區間的結束點的較大值。
當然可以。讓我們通過一個具體的例子和圖形來解釋合并重疊區間的算法。假設我們有以下區間集合:```
intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
```### 步驟 1: 排序
首先,我們根據區間的起始點對區間進行排序。排序后的區間如下:```
sorted_intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
```### 步驟 2: 初始化
我們初始化一個空列表 `merged` 來存儲合并后的區間,并添加排序后的第一個區間:```
merged = [[1, 3]]
```### 步驟 3: 遍歷并合并
接下來,我們遍歷排序后的區間列表,從第二個區間開始,嘗試與 `merged` 列表中的最后一個區間合并。#### 合并第一個區間
第二個區間 `[2, 6]` 與 `merged` 中的最后一個區間 `[1, 3]` 重疊(因為 `2 <= 3`)。我們合并這兩個區間,合并后的區間為 `[1, 6]`,并更新 `merged` 列表:```
merged = [[1, 6]]
```#### 合并第二個區間
第三個區間 `[8, 10]` 與 `merged` 中的最后一個區間 `[1, 6]` 不重疊(因為 `8 > 6`)。我們直接將這個區間添加到 `merged` 列表中:```
merged = [[1, 6], [8, 10]]
```#### 合并第三個區間
第四個區間 `[15, 18]` 與 `merged` 中的最后一個區間 `[8, 10]` 不重疊(因為 `15 > 10`)。我們直接將這個區間添加到 `merged` 列表中:```
merged = [[1, 6], [8, 10], [15, 18]]
```### 最終結果
經過上述步驟,我們得到了合并所有重疊區間后的不重疊區間數組:```
[[1, 6], [8, 10], [15, 18]]
```### 圖形解釋
下面是每個步驟的圖形表示:1. **初始狀態**:```[1, 3] [2, 6] [8, 10] [15, 18]```2. **合并第一個區間**:```[1, 6] [8, 10] [15, 18]```3. **合并第二個區間**:```[1, 6] [8, 10] [15, 18]```4. **合并第三個區間**:```[1, 6] [8, 10] [15, 18]```通過這種方式,我們可以看到每個區間如何被合并,以及最終如何得到一個不重疊的區間數組,該數組覆蓋了所有原始區間。
?
解法
class Solution:def merge(self, intervals: list[list[int]]) -> list[list[int]]:if not intervals or len(intervals) <= 1:return intervalsintervals.sort(key =lambda x : x[0])merged = [intervals[0]]for current in intervals[1:]:last = merged[-1]if current[0] <= last[1]:last[1] = max(last[1], current[1])else:merged.append(current)return merged
學習
if not intervals or len(intervals) <= 1: 這行代碼是一個條件語句,用于檢查 intervals 列表的特定條件。讓我們分解這個條件語句來理解它的含義:intervals:這是一個變量,通常是一個列表,包含了一系列的區間,每個區間由一個包含兩個元素的列表表示,如 [[start, end]]。not intervals:這部分檢查 intervals 是否為 False。在Python中,空列表 [] 被視為 False。所以,如果 intervals 是空列表,not intervals 將為 True。len(intervals) <= 1:這部分檢查 intervals 列表的長度是否小于或等于1。如果列表中元素的數量不超過1,即列表為空或只包含一個元素,這個條件為 True。or:這是一個邏輯運算符,用于連接兩個條件。如果任一條件為 True,則整個表達式的結果為 True。綜合來看,if not intervals or len(intervals) <= 1: 這個條件語句的意思是:如果 intervals 是空列表(即沒有區間),或者
如果 intervals 只包含一個區間或沒有區間,
那么這個條件語句為真。在這種情況下,通常不需要進一步處理,因為合并區間的邏輯主要適用于至少有兩個區間的情況。如果只有一個或沒有區間,可以直接返回原始列表,因為沒有重疊的區間需要合并。在合并區間的算法中,這個條件通常用于快速返回,避免不必要的計算。例如,如果列表為空或只有一個區間,就直接返回這個列表,因為不需要合并。
`intervals.sort(key=lambda x: x[0])` 這行代碼是對列表 `intervals` 進行原地(in-place)排序的語句。這里的 `sort` 方法會對列表中的元素按照指定的關鍵字進行排序。讓我們分解這行代碼來更好地理解它:1. `intervals`:這是需要排序的列表,其中每個元素都是一個表示區間的列表 `[start, end]`。2. `sort`:這是Python列表的一個方法,用于對列表中的元素進行排序。默認情況下,`sort` 方法會按照元素的自然順序進行排序,對于數字來說是從小到大,對于字符串來說是按照字母順序。3. `key`:這是`sort`方法的一個可選參數,它接受一個函數作為參數。這個函數會在每個元素上調用,`sort`方法會根據這個函數返回的結果來決定元素的排序順序。4. `lambda x: x[0]`:這是一個匿名函數,也稱為lambda函數。它接受一個參數 `x`(在這里,`x` 是 `intervals` 列表中的每個區間),并返回 `x[0]`,即每個區間的起始點。這個lambda函數作為 `key` 參數的值,意味著排序將基于區間的起始點進行。綜上所述,`intervals.sort(key=lambda x: x[0])` 這行代碼的作用是將 `intervals` 列表中的區間按照它們的起始點進行升序排序。這樣,排序后的列表中,每個區間的起始點都會小于或等于它后面區間的起始點,這為后續合并重疊區間的步驟提供了便利。