LeetCode經典題解:128、最長連續序列

“最長連續序列”是一道極具代表性的數組處理問題, 本文將帶你從直觀思路出發,逐步推導出最優解法,并通過場景化記憶技巧掌握核心邏輯。

一、題目描述

題目:給定一個未排序的整數數組 nums,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。
要求:時間復雜度為 O(n)。

示例
輸入:nums = [100, 4, 200, 1, 3, 2]
輸出:4
解釋:最長連續序列是 [1, 2, 3, 4],長度為 4

二、解法分析:從暴力到最優

方法一:暴力法(直觀但超時)

思路

對每個數 x,檢查 x+1, x+2, ... 是否存在于數組中,記錄最長連續序列的長度。

代碼
public int longestConsecutive(int[] nums) {int longestStreak = 0;for (int num : nums) {int currentNum = num;int currentStreak = 1;while (arrayContains(nums, currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}return longestStreak;
}private boolean arrayContains(int[] arr, int num) {for (int i = 0; i < arr.length; i++) {if (arr[i] == num) {return true;}}return false;
}
復雜度
  • 時間復雜度:O(n3)
    • 遍歷數組 O(n)
    • 對每個數檢查后續 O(n)
    • 每次檢查是否存在 O(n)
  • 空間復雜度:O(1)

方法二:排序法(O(n log n),不符合要求但易理解)

思路

先排序數組,再遍歷統計連續序列長度。

代碼
public int longestConsecutive(int[] nums) {if (nums.length == 0) return 0;Arrays.sort(nums);int longestStreak = 1;int currentStreak = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] != nums[i-1]) {if (nums[i] == nums[i-1] + 1) {currentStreak++;} else {longestStreak = Math.max(longestStreak, currentStreak);currentStreak = 1;}}}return Math.max(longestStreak, currentStreak);
}
復雜度
  • 時間復雜度:O(n log n)(排序主導)
  • 空間復雜度:O(1)(忽略排序的棧空間)

方法三:哈希表優化(O(n),最優解)

思路
  1. 用哈希表存儲所有數:快速判斷某個數是否存在(O(1))。
  2. 僅從序列起點開始計數:若 x-1 不存在,則 x 是序列起點,開始向后計數。
代碼
public int longestConsecutive(int[] nums) {// 用 HashSet 存儲所有數,支持 O(1) 查詢Set<Integer> numSet = new HashSet<>();for (int num : nums) {numSet.add(num);}int longestStreak = 0;// 遍歷每個數,若它是序列起點,則向后計數for (int num : numSet) {// 若 num-1 不存在,則 num 是序列起點if (!numSet.contains(num - 1)) {int currentNum = num;int currentStreak = 1;// 持續檢查 currentNum+1 是否存在while (numSet.contains(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}}return longestStreak;
}
復雜度
  • 時間復雜度:O(n)
    • 每個數最多被訪問兩次(一次插入哈希表,一次計數)
  • 空間復雜度:O(n)(哈希表存儲所有數)

三、最優解法的核心邏輯

1. 為什么用哈希表?

哈希表(HashSet)提供 O(1) 的查找效率,能快速判斷某個數是否存在,避免了暴力法中的嵌套循環。

2. 如何避免重復計數?

關鍵在于只從序列的起點開始計數。例如,對于序列 [1, 2, 3, 4],我們只在遇到 1 時才開始向后計數,遇到 2, 3, 4 時直接跳過。
判斷條件:若 num-1 不存在于哈希表中,則 num 是序列起點。

四、記憶技巧:把代碼變成“尋寶游戲”

用場景化記憶法理解最優解法的核心邏輯:

1. 角色賦值

  • 哈希表(numSet):扮演“地圖”,標記所有寶藏位置(數字存在)。
  • 遍歷過程:扮演“探險家”,在地圖上尋找寶藏。
  • 序列起點:扮演“特殊寶藏”,只有找到它才能開啟連續挖掘。

2. 游戲規則

① 探險家拿到地圖(哈希表),標記所有寶藏位置。
② 探險家隨機站在一個數字位置上,檢查:

  • 如果左邊一格(num-1)沒有寶藏,則當前位置是“特殊寶藏”,可開啟連續挖掘;
  • 如果左邊有寶藏,則跳過當前位置(留給左邊的寶藏來挖掘)。
    ③ 挖到一個寶藏后,持續向右挖掘(檢查 num+1),記錄最長連續挖掘長度。

3. 關鍵記憶點

  • 只從序列起點開始挖掘 → 避免重復計數。
  • 哈希表快速定位寶藏 → O(1) 查詢效率。

五、實戰拓展:變種題鞏固思路

  1. 允許重復元素:原題已自動處理(哈希表去重)。
  2. 返回具體序列:在計數時記錄起點和終點,最后構造序列。
  3. 雙向擴展:同時向前(num-1, num-2, ...)和向后擴展,適用于“允許不連續但可排序”的場景。

通過“尋寶游戲”的場景記憶,最優解法的邏輯會變得非常直觀。記住:算法的本質是“用合適的數據結構優化操作”,本題中哈希表的作用不僅是存儲數據,更是為了快速判斷“起點”,從而避免重復計算。多思考這種“篩選起點”的思想,能幫助你解決更多類似問題。

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

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

相關文章

電力分析儀的“雙語對話”:CCLinkIE與Modbus TCP的無縫連接

在工業自動化領域&#xff0c;協議兼容性問題如同“方言壁壘”&#xff0c;讓不同品牌、不同系統的設備難以高效協同。對于電力分析儀這類關鍵設備而言&#xff0c;如何打破CCLinkIE與Modbus TCP協議的“語言障礙”&#xff0c;已成為工程師優化系統集成的核心課題。 為何需要協…

暑假復習篇之文本編譯器

一、知識點補充【在此次示例代碼上顯示的關鍵用法】知識點1、JMenuBar&#xff1a;菜單欄的容器&#xff0c;通常添加到JFrame的頂部。關鍵用法&#xff1a;add&#xff1a; 添加菜單到菜單欄2、JMenu&#xff1a;菜單條目&#xff08;“文件” “編輯” 等&#xff09;&#x…

Linux自動化構建工具(一)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄Li…

目標檢測流程圖繪制

目標檢測流程圖繪制作為一個長期科研的苦命人&#xff0c;我一般采用Processon。 一、目標檢測流程圖繪制的 “量身定制” 體驗 Processon 的繪圖元素庫對目標檢測領域極度友好&#xff0c;從基礎模塊到復雜結構都能精準匹配&#xff1a; ??核心組件一鍵調用&#xff1a;在右…

GitHub 趨勢日報 (2025年07月09日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖970genai-toolbox780WebAgent650rustfs451prompt-eng-interactive-tutorial246ai-a…

多云環境下的成本管理挑戰與對策 ——資源碎片化治理與華為CloudMatrix破局之道

一、危機&#xff1a;多云成本失控已成企業“隱形殺手”成本超支概率激增據Gartner 2024報告&#xff0c;采用多云策略的企業成本超支概率比單云企業高47%&#xff0c;主因資源碎片化導致的閑置浪費和管控失效。觸目驚心的數據&#xff1a;73%企業云成本占營收超20%&#xff0c…

Linux的基礎I/O

目錄 1、理解“文件” 1.1 狹義理解 1.2 廣義理解 1.3 文件操作的歸類認知 1.4 系統角度 2、回顧C文件接口 2.1 文件的打開與關閉 2.2 文件的讀寫函數 2.3 stdin & stdout & stderr 3、系統文件I/O 3.1 一種傳標志位的方式 3.2 文件的系統調用接口 3.2.1 o…

廣告匹配策略的智能化之路:人工智能大模型的方法和步驟

摘要 廣告匹配策略是指根據用戶的需求和偏好&#xff0c;向用戶推薦最合適的廣告的方法。廣告匹配策略的優化是數字化營銷的核心問題之一&#xff0c;也是提升廣告效果和收益的關鍵因素。本文介紹了如何利用人工智能大模型&#xff0c;從數據分析、廣告推薦、策略優化、效果評…

飛算JavaAI:重塑Java開發的“人機協同“新模式

引言 在Java開發領域&#xff0c;“效率"與"質量"的平衡始終是開發者面臨的核心挑戰——重復編碼消耗精力、復雜業務易出漏洞、老系統重構舉步維艱。飛算JavaAI的出現&#xff0c;并非簡單地用AI替代人工&#xff0c;而是構建了一套"AI處理機械勞動&#…

運行ssh -T git@github.com報錯

運行ssh -T gitgithub.com報錯 no such identity: /root/.ssh/id_rsa: No such file or directory gitssh.github.com: Permission denied (publickey). 如果我用的是ed25519而非rsa&#xff0c;有id_ed25519 則需要打開~/.ssh/config檢查一下是否寫錯了 vim ~/.ssh/config 然后…

20250710-2-Kubernetes 集群部署、配置和驗證-網絡組件存在的意義?_筆記

一、網絡組件的作用&#xfeff;1. 部署網絡組件的目的&#xfeff;核心功能&#xff1a;執行kubectl apply -f calico.yaml命令的主要目的是為Kubernetes集群部署網絡組件必要性&#xff1a;解決Pod間的跨節點通信問題建立集群范圍的網絡平面&#xff0c;使所有Pod處于同一網絡…

【牛客刷題】dd愛科學1.0

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述:1.3 輸出描述:1.4 示例1二、解題思路2.1 核心策略2.2 算法流程2.3 正確性證明三、算法實現四、關鍵步驟解析五、復雜度分析六、正確性驗證七、算法對比7.1 暴力搜索法7.2 動態規劃7.3 三種解法對比分析一、題目介紹 1.1 題目描…

跑步-Java刷題 藍橋云課

目錄 題目鏈接 題目 解題思路 代碼 題目鏈接 競賽中心 - 藍橋云課 題目 解題思路 用數組記錄每個月有多少天,再使用一個int型變量記錄是星期幾,遍歷即可 代碼 import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改public class Main {public stat…

Qt常用控件之QWidget(二)

Qt常用控件&#xff08;二&#xff09;1.window frame2.windowTitle3.windowIcon&#x1f31f;&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xff1a;【Qt的學習】 &#x1f4dd;&#x1f4dd;本篇…

飛算Java AI:專為 Java 開發者打造的智能開發引擎

目錄 一&#xff0c;核心功能 1&#xff0c;智能編碼&#xff08;AI Coding&#xff09; 2&#xff0c;AI 驅動測試&#xff08;AI Testing&#xff09; 3&#xff0c;智能運維&#xff08;AIOps&#xff09; 4&#xff0c;工程化支持 二、注冊與上手&#xff1a;3 分鐘快…

基于開源AI大模型AI智能名片S2B2C商城小程序源碼的私域流量新生態構建

摘要&#xff1a;私域流量并非新生概念&#xff0c;企業持續構建和經營“企業 - 客戶”關系是其持續存在的關鍵&#xff0c;且會隨時代發展自我完善迭代。本文探討了開源AI大模型AI智能名片S2B2C商城小程序源碼在私域流量領域的應用價值。通過分析私域流量發展現狀與挑戰&#…

用 ELK+Filebeat 提高50%問題排查效率,這套方案實測有效!

摘要 在中大型系統中&#xff0c;日志的分布常常讓問題排查變得異常痛苦&#xff1a;每次出錯都要登錄一堆服務器、翻一堆文本&#xff0c;還不一定能找到關鍵線索。為了解決這個問題&#xff0c;ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;日志聚合平臺應運而…

數據治理到底是什么?搞清這四件事,你就徹底明白了!

目錄 第一件事&#xff1a;數據治理不是做“數據”&#xff0c;是做“管” 第二件事&#xff1a;治理的核心&#xff0c;是“數、責、權”的三角綁定 一是“數”&#xff1a;你到底有哪些數據&#xff1f; 二是“責”&#xff1a;每張表、每個字段是誰負責&#xff1f; 三…

Spring的事務控制——學習歷程

思考&#xff1a;1. 事務是干什么的&#xff1f;2. 事務的特性&#xff1f;3. 事務控制的傳播方式&#xff08;傳播行為&#xff09;4. 事務的隔離級別5. 事務是如何實現的&#xff1f;6. 事務的回滾方式7. 事務失效場景回答&#xff1a;1. 事務和鎖&#xff0c;還有版本控制 …

鴻蒙 Secure Boot 全流程解析:從 BootROM 到內核簽名驗證的實戰指南

摘要 隨著智能設備應用的深入&#xff0c;操作系統安全成為設備可信運行的基礎。在物聯網和多終端場景中&#xff0c;一旦系統被惡意篡改&#xff0c;將帶來數據泄露、設備被控等嚴重后果。鴻蒙系統在安全啟動方面設計了完整的機制&#xff0c;從最底層的 Boot ROM 開始逐級校驗…