【leetcode 3】最長連續序列 (Longest Consecutive Sequence) - 解題思路 + Golang實現

最長連續序列 (Longest Consecutive Sequence) - LeetCode 題解

題目描述

給定一個未排序的整數數組 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
解釋:最長數字連續序列是 [0,1,2,3,4,5,6,7,8]。它的長度為 9。

示例 3:

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

解題思路

方法一:哈希集合(推薦)

  1. 哈希集合預處理

    • 將所有數字存入哈希集合中,實現O(1)時間復雜度的查找
    • 去重處理,避免重復數字的影響
  2. 尋找連續序列

    • 遍歷數組中的每個數字
    • 對于每個數字,檢查它是否是某個連續序列的起點(即num-1不在集合中)
    • 如果是起點,則向后查找連續的數字,計算當前連續序列的長度
    • 更新最長連續序列的長度
  3. 復雜度分析

    • 時間復雜度:O(n),每個數字最多被訪問兩次(一次在哈希集合中,一次在連續序列查找中)
    • 空間復雜度:O(n),用于存儲哈希集合

方法二:排序法(不滿足O(n)要求)

  1. 排序數組

    • 先對數組進行排序
    • 然后遍歷排序后的數組,尋找最長連續序列
  2. 缺點

    • 時間復雜度為O(n log n),不滿足題目要求
    • 僅作為對比思路提及

Go 代碼實現

func longestConsecutive(nums []int) int {if len(nums) == 0 {return 0}// 創建哈希集合存儲所有數字numSet := make(map[int]bool)for _, num := range nums {numSet[num] = true}longestStreak := 0// 遍歷哈希集合中的每個數字for num := range numSet {// 檢查當前數字是否是某個連續序列的起點if !numSet[num-1] {currentNum := numcurrentStreak := 1// 向后查找連續的數字for numSet[currentNum+1] {currentNum++currentStreak++}// 更新最長連續序列長度if currentStreak > longestStreak {longestStreak = currentStreak}}}return longestStreak
}func main() {// 示例測試nums1 := []int{100, 4, 200, 1, 3, 2}result1 := longestConsecutive(nums1)fmt.Println("Longest consecutive sequence length:", result1) // 輸出: 4nums2 := []int{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}result2 := longestConsecutive(nums2)fmt.Println("Longest consecutive sequence length:", result2) // 輸出: 9nums3 := []int{1, 0, 1, 2}result3 := longestConsecutive(nums3)fmt.Println("Longest consecutive sequence length:", result3) // 輸出: 3
}

測試用例

func TestLongestConsecutive(t *testing.T) {tests := []struct {input []intwant  int}{{[]int{100, 4, 200, 1, 3, 2}, 4},{[]int{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}, 9},{[]int{1, 0, 1, 2}, 3},{[]int{}, 0},{[]int{1}, 1},{[]int{1, 3, 5, 7, 9}, 1},{[]int{1, 2, 3, 4, 5}, 5},{[]int{5, 4, 3, 2, 1}, 5},}for _, tt := range tests {got := longestConsecutive(tt.input)if got != tt.want {t.Errorf("longestConsecutive(%v) = %d, want %d", tt.input, got, tt.want)}}
}

復雜度分析

  1. 時間復雜度:O(n)

    • 創建哈希集合:O(n)
    • 遍歷哈希集合:每個數字最多被訪問兩次(一次在哈希集合中,一次在連續序列查找中)
    • 總體時間復雜度為線性
  2. 空間復雜度:O(n)

    • 需要額外的哈希集合存儲所有數字

優化思路

  1. 并行處理

    • 對于大規模數據,可以考慮將數組分割后并行處理
    • 需要處理邊界條件和合并結果
  2. 內存優化

    • 如果數字范圍有限,可以使用位圖代替哈希集合
    • 減少內存使用,提高緩存命中率
  3. 流式處理

    • 對于無法一次性加載到內存的超大數據集
    • 可以使用外部排序和分段處理技術

總結

這道題考察了對哈希數據結構的靈活運用,關鍵在于如何高效地判斷連續序列的起點和計算序列長度。通過使用哈希集合,我們可以在O(n)時間復雜度內解決問題,這比排序法更高效。掌握這種利用空間換時間的思路對解決類似問題很有幫助。

擴展思考

  1. 如果要求返回最長的連續序列本身而不僅僅是長度,該如何修改代碼?
  2. 如何修改算法以處理包含重復數字的情況(雖然當前解法已經處理了)?
  3. 如果數字范圍非常大但稀疏,如何進一步優化空間復雜度?

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

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

相關文章

礦物分類系統開發筆記(一):數據預處理

目錄 一、數據基礎與預處理目標 二、具體預處理步驟及代碼解析 2.1 數據加載與初步清洗 2.2 標簽編碼 2.3 缺失值處理 (1)刪除含缺失值的樣本 (2)按類別均值填充 (3)按類別中位數填充 (…

《UE5_C++多人TPS完整教程》學習筆記43 ——《P44 奔跑混合空間(Running Blending Space)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P44 奔跑混合空間(Running Blending Space)》 的學習筆記,該系列教學視頻為計算機工程師、程序員、游戲開發者、作家(Engineer, Programmer, Game Developer, Author&…

TensorRT-LLM.V1.1.0rc1:Dockerfile.multi文件解讀

一、TensorRT-LLM有三種安裝方式,從簡單到難 1.NGC上的預構建發布容器進行部署,見《tensorrt-llm0.20.0離線部署DeepSeek-R1-Distill-Qwen-32B》。 2.通過pip進行部署。 3.從源頭構建再部署,《TensorRT-LLM.V1.1.0rc0:在無 GitHub 訪問權限的服務器上編…

UniApp 實現pdf上傳和預覽

一、上傳1、html<template><button click"takeFile">pdf上傳</button> </template>2、JStakeFile() {// #ifdef H5// H5端使用input方式選擇文件const input document.createElement(input);input.type file;input.accept .pdf;input.onc…

《用Proxy解構前端壁壘:跨框架狀態共享庫的從零到優之路》

一個項目中同時出現React的函數式組件、Vue的模板語法、Angular的依賴注入時,數據在不同框架體系間的流轉便成了開發者不得不面對的難題—狀態管理,這個本就復雜的命題,在跨框架場景下更顯棘手。而Proxy,作為JavaScript語言賦予開發者的“元編程利器”,正為打破這道壁壘提…

MOESI FSM的全路徑測試用例

MOESI FSM的全路徑測試用例摘要&#xff1a;本文首先提供一個UVM版本的測試序列&#xff08;基于SystemVerilog和UVM框架&#xff09;&#xff0c;設計為覆蓋MOESI FSM的全路徑&#xff1b;其次詳細解釋如何使用覆蓋組&#xff08;covergroup&#xff09;來量化測試的覆蓋率&am…

git倉庫和分支的關系

1?? 倉庫分支&#xff08;Repository Branch&#xff09;每個 Git 倉庫都有自己的分支結構。分支決定你當前倉庫看到的代碼版本。示例&#xff1a;倉庫分支只是局部修改&#xff0c;項目分支才是全局管理所有倉庫分支的概念。wifi_camera 倉庫&#xff1a; - main - dev - fe…

Linux的基本操作

Linux 系統基礎操作完整指南一、文件與目錄操作1. 導航與查看pwd (Print Working Directory)作用&#xff1a;顯示當前所在目錄的完整路徑示例&#xff1a;pwd → 輸出 /home/user/documents使用場景&#xff1a;當你在多層目錄中迷失時快速定位當前位置ls (List)常用選項&…

npm設置了鏡像 pnpm還需要設置鏡像嗎

npm配置鏡像后是否需要為pnpm單獨設置鏡像&#xff1f; 是的&#xff0c;即使您已經為npm設置了鏡像源&#xff08;如淘寶鏡像&#xff09;&#xff0c;仍然需要單獨為pnpm配置鏡像源。這是因為npm和pnpm是兩個獨立的包管理工具&#xff0c;它們的配置系統和環境變量是分離的&a…

Linux管道

預備知識&#xff1a;進程通信進程需要某種協同&#xff0c;協同的前提條件是通信。有些數據是用來通知就緒的&#xff0c;有些是單純的傳輸數據&#xff0c;還有一些是控制相關信息。進程具有獨立性&#xff0c;所以通信的成本可能稍微高一點&#xff1b;進程間通信前提是讓不…

基于Spring Boot的快遞物流倉庫管理系統 商品庫存管理系統

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

腳手架開發-Common封裝基礎通用工具類<基礎工具類>

書接上文 java一個腳手架搭建_redission java腳手架-CSDN博客 以微服務為基礎搭建一套腳手架開始前的介紹-CSDN博客 腳手架開發-準備配置-進行數據初始化-配置文件的準備-CSDN博客 腳手架開發-準備配置-配置文件的準備項目的一些中間件-CSDN博客 腳手架開發-Nacos集成-CSD…

軟件系統運維常見問題

系統部署常見問題 環境配置、兼容性問題。生產與測試環境的操作系統、庫版本、中間件版本不一致&#xff0c;運行環境軟件版本不匹配。新舊版本代碼/依賴不兼容。依賴缺失或沖突問題。后端包啟動失敗&#xff0c;提示類/方法/第三方依賴庫找不到或者版本沖突。配置錯誤。系統啟…

2021 IEEE【論文精讀】用GAN讓音頻隱寫術騙過AI檢測器 - 對抗深度學習的音頻信息隱藏

使用GAN生成音頻隱寫術的隱寫載體 本文為個人閱讀GAN音頻隱寫論文&#xff0c;部分內容注解&#xff0c;由于原文篇幅較長這里就不再一一粘貼&#xff0c;僅對原文部分內容做注解&#xff0c;僅供參考詳情參考原文鏈接 原文鏈接&#xff1a;https://ieeexplore.ieee.org/abstra…

PWA技術》》漸進式Web應用 Push API 和 WebSocket 、webworker 、serviceworker

PWA # 可離線 # 高性能 # 無需安裝 # 原生體驗Manifest {"name": "天氣助手", // 應用全名"short_name": "天氣", // 短名稱&#xff08;主屏幕顯示&#xff09;"start_url": "/index.html&…

數據結構——棧和隊列oj練習

225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09; 這一題需要我們充分理解隊列和棧的特點。 隊列&#xff1a;隊頭出數據&#xff0c;隊尾入數據。 棧&#xff1a;棧頂出數據和入數據。 我們可以用兩個隊列實現棧&#xff0c;在這過程中&#xff0c;我們總要保持其…

Java基礎 8.19

目錄 1.局部內部類的使用 總結 1.局部內部類的使用 說明&#xff1a;局部內部類是定義在外部類的局部位置&#xff0c;比如方法中&#xff0c;并且有類名可以直接訪問外部類的所有成員&#xff0c;包含私有的不能添加訪問修飾符&#xff0c;因為它的地位就是一個局部變量。局…

從父類到子類:C++ 繼承的奇妙旅程(2)

前言&#xff1a;各位代碼航海家&#xff0c;歡迎回到C繼承宇宙&#xff01;上回我們解鎖了繼承的「基礎裝備包」&#xff0c;成功馴服了public、protected和花式成員隱藏術。但——??前方高能預警&#xff1a; 繼承世界的暗流涌動遠不止于此&#xff01;今天我們將勇闖三大神…

【圖像算法 - 16】庖丁解牛:基于YOLO12與OpenCV的車輛部件級實例分割實戰(附完整代碼)

庖丁解牛&#xff1a;基于YOLO12與OpenCV的車輛部件級實例分割實戰&#xff08;附完整代碼&#xff09; 摘要&#xff1a; 告別“只見整車不見細節”&#xff01;本文將帶您深入實戰&#xff0c;利用YOLO12-seg訓練實例分割模型&#xff0c;結合OpenCV的強大圖像處理能力&…

ubuntu22.04配置遠程桌面

文章目錄前言檢查桌面類型xorg遠程桌面(xrdp)安裝xrdpxrdp添加到ssl-certwayland遠程桌面(gnome-remote-desktop)檢查安裝開啟開啟狀況檢查自動登錄奇技淫巧前言 在windows上使用遠程桌面服務&#xff0c;連接ubuntu主機的遠程桌面 檢查桌面類型 查看桌面類型、協議 echo $…