【合并區間】

問題

以數組 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` 列表中的區間按照它們的起始點進行升序排序。這樣,排序后的列表中,每個區間的起始點都會小于或等于它后面區間的起始點,這為后續合并重疊區間的步驟提供了便利。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64718.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot_第二天

SpringBoot_第二天 學習目標 Mybatis整合&數據訪問 使用SpringBoot開發企業項目時&#xff0c;持久層數據訪問是前端頁面數據展示的基礎&#xff0c;SpringBoot支持市面上常見的關系庫產品(Oracle,Mysql,SqlServer,DB2等)對應的相關持久層框架&#xff0c;當然除了對于關系…

SparseViT:基于稀疏編碼Transformer的非語義中心、參數高效的圖像篡改定位

摘要 https://arxiv.org/pdf/2412.14598 非語義特征或語義無關特征&#xff0c;與圖像上下文無關但對圖像篡改敏感&#xff0c;被認為是圖像篡改定位&#xff08;IML&#xff09;的重要證據。由于無法獲得人工標簽&#xff0c;現有工作依賴于手工方法提取非語義特征。手工非語…

Redisson 分布式鎖獲取tryLock和lock的區別

問題 boolean isLock lock.tryLock(10, 30, TimeUnit.SECONDS); boolean isLock lock.lock(30, TimeUnit.SECONDS); boolean isLock lock.lock(); 三者的區別&#xff1f;&#xff1f; 這三個方法都是用于獲取 Redisson 分布式鎖的&#xff0c;但它們在獲取鎖的方式和行為…

【git】git生成rsa公鑰的方法

git生成rsa公鑰的方法 一&#xff0c;簡介二&#xff0c;操作方法三&#xff0c;總結 一&#xff0c;簡介 在工作的過程中&#xff0c;經常需要生成rsa的密鑰&#xff0c;然后提供給別人&#xff0c;然后別人給你開通代碼下載權限。本文介紹如何在本地生成rsa的密鑰供參考。 …

Zookeeper模式安裝Kafka(含常規、容器兩種安裝方式)

一、#創作靈感# 公司使用Kafka的軟件項目較多&#xff0c;故寫技術筆記鞏固知識要點 二、軟件環境 - Kafka 3.9.0 官方下載地址&#xff1a;Kafka 3.9.0 - ZooKeeper 3.9.3 官方下載地址&#xff1a;ZooKeeper 3.9.3 - Docker Desktop 4.37 容器圖形化工具 官方下載地址…

7.傅里葉級數練習題

7.傅里葉級數練習題 設函數&#xff1a; f ( x ) { ? x , 0 ≤ x ≤ 1 2 , 2 ? 2 x , 1 2 < x < 1 , f(x) \begin{cases} -x, & 0 \leq x \leq \frac{1}{2}, \\ 2 - 2x, & \frac{1}{2} < x < 1, \end{cases} f(x){?x,2?2x,?0≤x≤21?,21?<x&…

【高項】信息系統項目管理師(二)項目管理概論

一、PMBOK的發展 項目管理知識體系&#xff08;PMBOK&#xff09;是由美國項目管理協會&#xff08;PMI&#xff09;開發的一套描述項目管理專業范圍的知識體系&#xff0c;包含了對項目管理所需的知識、技能和工具的描述。 二、項目基本要素 2.1 項目基礎 項目是為提供一項…

C++設計模式:狀態模式(自動售貨機)

什么是狀態模式&#xff1f; 狀態模式是一種行為型設計模式&#xff0c;它允許一個對象在其內部狀態發生改變時&#xff0c;動態改變其行為。通過將狀態相關的邏輯封裝到獨立的類中&#xff0c;狀態模式能夠將狀態管理與行為解耦&#xff0c;從而讓系統更加靈活和可維護。 通…

【Pytorch實用教程】循環神經網絡中使用dropout需要注意的問題

文章目錄 問題解答警告的具體含義解決方案示例代碼總結問題 UserWarning: dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=0.3 and num_layers=1 warnings.warn("dropout op…

數據中臺與數據治理服務方案[50頁PPT]

本文概述了數據中臺與數據治理服務方案的核心要點。數據中臺作為政務服務數據化的核心&#xff0c;通過整合各部門業務系統數據&#xff0c;進行建模與加工&#xff0c;以新數據驅動政府管理效率提升與政務服務能力增強。數據治理則聚焦于解決整體架構問題&#xff0c;確保數據…

postgresq-自定義執行計劃(custom plan)與generic plan(通用執行計劃)

文章目錄 之前寫過一篇關于 PostgreSQL prepare sql的文章&#xff0c;但當時沒有提到generic plan(通用計劃)和custom plan(自定義計劃)這兩個概念。現在將通過舉例介紹這兩個概念。 創建測試表&#xff1a; postgres# create database demo; CREATE DATABASE postgres# \c d…

dockfile 配置 /etc/apt/source.list.d/debian.list 清華鏡像

docker:3.12.7 鏡像使用的是 debian 系統&#xff0c;比 ubuntu 更輕量。debian 系統內&#xff0c;apt 鏡像源列表位于 /etc/apt/source.list.d/debian.list&#xff08;作為對比&#xff0c;ubuntu 的鏡像列表位于 /etc/apt/source.list&#xff0c;二者語法相同&#xff09;…

程序員測試日常小工具

作為一名程序員&#xff0c;或者測試人員&#xff0c;日常工作最常用的工具有哪些&#xff0c;截圖&#xff0c;截圖漂浮&#xff0c;翻譯&#xff0c;日期處理&#xff0c;api調用...&#xff0c; 當你拿到一串報文后&#xff0c;想要json轉換時&#xff0c;是不是要打…

【MySQL高級】第1-4章

第1章 存儲過程 1.1 什么是存儲過程&#xff1f; 存儲過程可稱為過程化SQL語言&#xff0c;是在普通SQL語句的基礎上增加了編程語言的特點&#xff0c;把數據操作語句(DML)和查詢語句(DQL)組織在過程化代碼中&#xff0c;通過邏輯判斷、循環等操作實現復雜計算的程序語言。 換…

深入淺出:AWT事件監聽器及其應用

前言 在Java的GUI編程中&#xff0c;事件處理是非常重要的一環。AWT&#xff08;Abstract Window Toolkit&#xff09;框架提供了靈活的事件處理機制&#xff0c;使得開發者能夠響應用戶的操作&#xff0c;例如點擊按鈕、鍵盤輸入、鼠標點擊等。AWT的事件監聽器就是實現這一機…

【Rust自學】8.5. HashMap Pt.1:HashMap的定義、創建、合并與訪問

8.5.0. 本章內容 第八章主要講的是Rust中常見的集合。Rust中提供了很多集合類型的數據結構&#xff0c;這些集合可以包含很多值。但是第八章所講的集合與數組和元組有所不同。 第八章中的集合是存儲在堆內存上而非棧內存上的&#xff0c;這也意味著這些集合的數據大小無需在編…

混合合并兩個pdf文件

混合兩個pdf 1、在線免費交替和混合奇數和偶數PDF頁面2、有什么軟件把兩個 PDF 交叉合并&#xff1f;3、pdfsam本地合并 如何Google翻譯的原文和譯文合并&#xff0c;&#xff08;沉浸式翻譯效果相對較好&#xff09; 1、在線免費交替和混合奇數和偶數PDF頁面 https://deftpd…

Hutool 發送 HTTP 請求的幾種常見寫法

最簡單的 GET 請求&#xff1a; String result HttpUtil.get("https://www.baidu.com");帶參數的 GET 請求&#xff1a; // 方法1: 直接拼接URL參數 String result HttpUtil.get("https://www.baidu.com?name張三&age18");// 方法2: 使用 HashMap…

獲取用戶詳細信息-ThreadLocal優化

Thread全局接口可用&#xff0c;不用再重復編寫。所以為了代碼的復用&#xff0c;使用Thread。把之前的內容&#xff08;函數的參數和map與username&#xff09;注釋掉&#xff0c;換為Thread傳過來的內容&#xff08;map與username&#xff09;。 因為Thread需要在攔截器里面…

THUCNews解壓/THUCNews數據集解壓出問題

省流&#xff1a;使用zip64進行解壓&#xff0c;文件數目太多windows默認zip16裝不下 我在使用THUCNews中文文本數據集時出現了問題&#xff0c;原數據集解壓后應該包含以下兩個文件夾: 其中THUCNews文件夾下有以新聞類別命名的子文件。官網下載的是一個1.56GB的zip壓縮包 而我…