Python面試寶典第11題:最長連續序列

題目

????????給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。請你設計并實現時間復雜度為 O(n) 的算法解決此問題。

????????示例 1:

輸入:nums = [100,4,200,1,3,2]
輸出:4
解釋:最長數字連續序列是 [1, 2, 3, 4]。它的長度為 4。

????????示例 2:

輸入:nums = [0,3,7,2,5,8,4,6,0,1]
輸出:9

排序法

????????排序法在最壞情況下的時間復雜度為O(nlogn),不滿足本題時間復雜度為O(n)的要求。但它提供了一個不同的解題視角,還是值得我們學習一下的。使用排序法求解本題的主要步驟如下。

????????1、首先,將輸入數組nums進行排序。這一步的目的是使得連續的數字相鄰,便于后續遍歷查找連續序列。

????????2、對排序后的數組進行遍歷,并初始化兩個變量。其中,current_streak用于記錄當前連續序列的長度,longest_streak用于記錄遇到的最長連續序列的長度。

????????3、在遍歷過程中,比較當前元素與前一個元素的關系。如果當前元素正好比前一個元素大1,則說明它們屬于同一個連續序列,此時current_streak加1。否則,說明遇到了新的序列起點,此時更新longest_streak(如果current_streak大于longest_streak),并將current_streak重置為1。

????????注意:需要對數組中存在相同元素的情況進行額外處理,以避免重復元素導致的誤判。

????????根據上面的算法步驟,我們可以得出下面的示例代碼。

def get_longest_consecutive_by_sort(nums):if not nums:return 0nums.sort()longest_streak = 1current_streak = 1for i in range(1, len(nums)):# 避免重復元素導致的誤判if nums[i] != nums[i-1]:if nums[i] == nums[i-1] + 1:current_streak += 1else:longest_streak = max(longest_streak, current_streak)current_streak = 1return max(longest_streak, current_streak)print(get_longest_consecutive_by_sort([100, 4, 200, 1, 3, 2]))
print(get_longest_consecutive_by_sort([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))

哈希法

????????使用哈希法的基本思想如下:首先,將所有數組中的元素添加到哈希集合中,以便快速查詢一個數字是否已存在。然后,遍歷數組中的每個元素,對于每個元素,檢查它是否是某個連續序列的起始點(即檢查num - 1不在哈希集合中)。如果是起始點,則嘗試向后擴展序列,同時更新最長序列長度。為了避免重復計算,每當我們確定了一個數字屬于某個連續序列時,就將其從哈希集合中移除。使用哈希法求解本題的主要步驟如下。

????????1、初始化。創建一個空的哈希集合num_set,用來存儲數組中的所有數字。

????????2、填充哈希集合。遍歷數組nums,將所有元素添加到哈希集合num_set中。

????????3、遍歷并檢查連續性。再次遍歷數組nums,對于每個元素,檢查它是否能作為連續序列的起點,即檢查 num - 1 是否不在 num_set 中。

????????4、擴展序列并更新長度。如果找到了一個起點,就嘗試通過不斷檢查 num + 1 是否在 num_set 中來擴展序列,并相應地更新最長序列長度。

????????5、移除已訪問元素。在擴展序列的過程中,將訪問過的數字從 num_set 中移除,以避免之后的重復計算。

????????6、返回找到的最長連續序列的長度。

????????根據上面的算法步驟,我們可以得出下面的示例代碼。

def get_longest_consecutive_by_hash(nums):if not nums:return 0num_set = set(nums)longest_streak = 0for num in num_set:if num - 1 not in num_set:current_num = numcurrent_streak = 1while current_num + 1 in num_set:current_num += 1current_streak += 1longest_streak = max(longest_streak, current_streak)return longest_streakprint(get_longest_consecutive_by_hash([100, 4, 200, 1, 3, 2]))
print(get_longest_consecutive_by_hash([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))

總結

????????使用哈希法求解本題時,每個元素僅被訪問兩次:一次加入哈希集合,另一次作為序列起點檢查。遍歷和序列擴展操作均在常數時間內完成,故總的時間復雜度為O(n),滿足本題的要求。另外,哈希法需要額外的空間來存儲哈希集合。最壞情況下,數組中的所有元素都是唯一的,因此哈希集合將存儲n個元素,空間復雜度為O(n)。

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

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

相關文章

微信小程序中的數據通信

方法1: 使用回調函數 在app.js中:可以在修改globalData后執行一個回調函數,這個回調函數可以是頁面傳遞給app的一個更新函數。// app.js App({globalData: {someData: ,},setSomeData(newData, callback) {this.globalData.someData = newData;if (typeof callback === funct…

打造熱銷爆款:LazadaShopee店鋪測評與關鍵詞策略

面對Lazada和Shopee平臺上店鋪銷量難以突破的困境,賣家們往往尋求各種解決方案。其中,店鋪測評作為提升店鋪信譽、優化產品排名及增加曝光度的有效手段,正逐漸成為賣家關注的焦點。以下將深入探討店鋪測評的好處、實施技巧及自養號的關鍵要素…

提升校園效率:智慧校園后勤管理中的尋物管理功能

在智慧校園后勤管理體系中,尋物管理功能扮演著連接遺失與找回的橋梁角色,它充分利用現代信息技術,為校園內的師生提供了一套高效、便捷的失物招領解決方案。此功能圍繞以下幾個核心方面展開。 首先,它支持在線報失與信息登記。一旦…

如何連接到公司的服務器?

1.下載FileZilla FileZilla的下載與安裝以及簡單使用(有圖解超簡單)-CSDN博客 2.打開 3.輸入主機 用戶名 密碼 端口 注:主機支持的協議類型: 4.連接成功 其他方式也有很多,比如通過cmd,html網頁等等 3個…

昇思25天學習打卡營第19天|ShuffleNet圖像分類

今天是參加昇思25天學習打卡營的第19天,今天打卡的課程是“ShuffleNet圖像分類”,這里做一個簡單的分享。 1.簡介 在第15-18日的學習內容中,我們陸陸續續學習了計算機視覺相關的模型包括圖像語義分割、圖像分類、目標檢測等內容&#xff0c…

面試遲到了怎么辦

嗨,我是蘭若姐姐。作為一名面試官,最近面試了很多的測試候選人,有了很多感慨,借此抒發一下,我不知道別人面試更看重的是什么,但是在我這里,我最看重的是態度,其次才是技能 我覺得作…

vivado EXTRACT_ENABLE、EXTRACT_RESET

可提取 EXTRACT_ENABLE控制寄存器推斷是否啟用。通常,Vivado工具 提取或不提取基于啟發式方法,通常有利于最大程度的 設計。如果Vivado的行為不符合預期,此屬性將覆蓋 工具的默認行為。如果有不希望的啟用連接到CE引腳 觸發器,此屬…

中關村軟件園發布“數據合規與出境評估服務平臺”

在2024中關村論壇年會期間,中關村軟件園發布“數據合規與出境評估服務平臺”。該平臺是中關村軟件園結合北京市“兩區”建設,立足軟件園國家數字服務出口基地和數字貿易港建設,圍繞園區內外部企業用戶的業務合作、科研創新、跨國運營等場景需…

Python UDP編程之實時聊天與網絡監控詳解

概要 UDP(User Datagram Protocol,用戶數據報協議)是網絡協議中的一種,主要用于快速、簡單的通信場景。與TCP相比,UDP沒有連接、確認、重傳等機制,因此傳輸效率高,但也不保證數據的可靠性和順序。本文將詳細介紹Python中如何使用UDP協議進行網絡通信,并包含相應的示例…

七天.NET 8操作SQLite入門到實戰 - 第一天 SQLite 簡介

什么是SQLite? SQLite是一個輕量級的嵌入式關系型數據庫,它以一個小型的C語言庫的形式存在。它的設計目標是嵌入式的,而且已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾…

Vscode插件推薦——智能切換輸入法(Smart IME)

前言 相信廣大程序員朋友在寫代碼的時候一定會遇到過一個令人非常頭疼的事情——切換輸入法,特別是對于那些勤于寫注釋的朋友,簡直就是噩夢,正所謂懶人推動世界發展,這不,今天就向大家推薦一款好用的vscode插件&#…

ES6 Class(類) 總結(九)

ES6 中的 class 是一種面向對象編程的語法糖,提供了一種簡潔的方式來定義對象的結構和行為。 JavaScript 語言中,生成實例對象的傳統方法是通過構造函數。下面是一個例子。 function Point(x, y) {this.x x;this.y y; } Point.prototype.toString fu…

使用定時器消除抖動

問題:定時器中斷和按鍵中斷屬于什么操作模式,輪詢嗎? 具體怎么實現 定時器中斷 (判斷) 時間參數 按鍵中斷(修改) 中斷 向量表.s文件 DCD SysTick_Handler …

如何理解跨界營銷?詳解跨界營銷的主要類型和方法!

跨界營銷是一種創新的營銷策略,它巧妙地捕捉不同行業、產品和消費者偏好之間的共通點和潛在聯系。這種策略將看似不相關的元素相互融合,相互影響,創造出一種全新的生活方式和審美觀念,以此吸引目標消費者群體的注意和青睞。 通過…

Oracle左連接過濾條件注意事項

1、left join 結果集行數與主表查詢結果集行數一致 2、主表與輔表多關聯條件要括起來 3、對于輔表的過濾條件寫在on后面是先對輔表過濾后再與主表關聯,寫在where后面是對主表與輔表關聯后的結果集再進行過濾 4、對于主表的過濾條件寫在on后面不生效,只能…

LiveNVR監控流媒體Onvif/RTSP用戶手冊-用戶管理:編輯、添加用戶、關聯通道、重置密碼、刪除、過濾搜索

LiveNVR監控流媒體Onvif/RTSP用戶手冊-用戶管理:編輯、添加用戶、關聯通道、重置密碼、刪除、過濾搜索 1、用戶管理1.1、添加用戶1.2、關聯通道1.3、重置密碼1.4、編輯1.5、刪除1.6、過濾搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒體服務 1、用戶管理 1.1、添加用戶 點擊用戶管理…

學習網絡的第一步:全面解析OSI與TCP/IP模型

我是小米,一個喜歡分享技術的29歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術干貨! Hello,大家好!我是你們的好朋友小米。今天我們來聊一聊網絡基礎知識中的重量級選手——OSI模型和TCP/IP模型!網絡的世界就像一個巨大的迷宮,而這兩個…

Docker 鏡像構建報 exec xxx.sh: no such file or directory

問題記錄 場景: 處于對nacos docker 部署最新版本的探究,但是nacos/nacos-server鏡像拉取不到最新版本,官網也是給出自己構建鏡像的方案。 具體步驟很簡單,先clone項目,然后簽出你要的nacos版本,通過docke…

算法力扣刷題記錄 四十二【101. 對稱二叉樹、100.相同的樹、572.另一個樹的子樹】

前言 二叉樹篇,開始對二叉樹操作練習。 記錄 四十二【101. 對稱二叉樹】。 繼續。 一、題目閱讀 給你一個二叉樹的根節點 root , 檢查它是否軸對稱。 示例 1: 輸入:root [1,2,2,3,4,4,3] 輸出:true示例 2&#x…

S5730交換機上配置訪問控制列表(ACL)、OSPF路由和PIM-SM組播

配置訪問控制列表(ACL) 假設我們創建一個簡單的ACL,允許或拒絕特定流量通過。 進入系統視圖 sys 創建一個標準ACL,允許192.168.1.0/24網段的流量通過 acl number 2001 rule 5 permit source 192.168.1.0 0.0.0.255 其他流量默…