LeetCode 128 最長連續序列 雜湊表法

2021-10-06 21:16:50 字數 2581 閱讀 4950

這裡是題目描述:leetcode-最長連續序列

如果題幹中不對時間複雜度做o(n)的限制的話,這道題沒有什麼難度,我們可以對陣列排序後使用雙指標(或者基於貪心演算法)來解本題,時間複雜度為o(nlogn)。但是加上時間複雜度不超過o(n)這一限制後,我們不能再採用先排序再貪心的方法,因為大多數排序演算法的時間複雜度都為o(nlogn),計數排序理論上的時間複雜度為o(n),但是這有限制條件——被排序的陣列必須足夠「緊湊」,如果被排序陣列過於「稀疏」時間複雜度便不再是o(n)

我們借助雜湊表來實現o(n)時間複雜度下對本題的解。將輸入陣列nums的包含的所有數字存入雜湊表中,這有兩個目的:一是去除nums中的重複數字,二是可以在o(1)時間開銷下確定某個數字是否存在於陣列nums中。基於雜湊表的初步方法:將nums中的數字存入雜湊表中;然後遍歷陣列nums(也可以使用foreach遍歷雜湊表的鍵),然後確定以當前遍歷到的數字x為開頭的連續序列長度,從x+1開始判斷x+1是否存在於雜湊表中,接下來判斷x+2x+3… 直到x+y不存在於雜湊表中,則此連續序列最大的數字是x+y-1,則該子串行長度是y,將所有的這些子串行中最大的長度作為最終結果返回。

但這種方法的時間複雜度仍然為o(n2),原因在於:我們確定了以x為開頭,以x+y-1為結尾的長度為y的連續序列x~x+y-1後,但仍然會遍歷到數字x+m (0基於雜湊表的方法1

對於遍歷到的乙個數字x,我們首先判斷nums中是否存在它的前驅數字x-1,如果存在,證明x不是乙個連續序列的第乙個數字,跳過x;如果不存在x-1,則x是乙個連續序列的第乙個數字,不跳過,開始搜尋x+1x+2…是否存在來確定子串行長度。這樣保證了每個連續子串行只被搜尋一遍,時間複雜度為o(n)

基於雜湊表方法1:

class

solution

//儲存nums中去重後的元素

hashset

hashset=

newhashset

<

>()

;for

(int i=

0;i)//開始尋找最長連續序列的長度

int maxlen=0;

for(

int e:hashset)

else

} maxlen=math.

max(maxlen,len);}

}return maxlen;

}}

時間複雜度:o(n)

空間複雜度:o(n)

基於雜湊表的方法2

記錄雜湊表中的數字是否已經被遍歷過,如果數字x被遍歷過,表示它所在的連續序列已近被搜尋過不需要再搜尋一遍,直接跳過x;如果x沒有被遍歷過,則開始搜尋x所在的連續序列的長度,和上面的只向後搜尋不同,這裡需要對x本身,和它左右兩邊的數字都進行搜尋並記錄它們已經被遍歷過,確定x所在連續序列長度

基於雜湊表方法2:

class

solution

//儲存nums中去重後的元素,並記錄它們是否已經被尋找過

hashmap

hashmap=

newhashmap

<

>()

;for

(int i=

0;i)//開始尋找最長最長連續序列的長度

int maxlen=0;

for(

int k:hashmap.

keyset()

)else

}for

(int i=k;

;i++

)//尋找連續序列中位於k後面的數字

else

} maxlen=math.

max(maxlen,len);}

}return maxlen;

}}

時間複雜度:o(n)

空間複雜度:o(n)

leetcode128 最長連續序列

給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。建立乙個dict,如果num不在裡面就檢視左右連續長度,再給num和左右處賦值 class solution...

Leetcode 128 最長連續序列

給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。複製 這道題目最開始大家想的肯定是sort,然後計數計算最長序列。但是要求時間複雜度為 o n 就不能用so...

LeetCode128 最長連續序列

原題目給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。題目分析 方法一 排序直接查詢法 先對陣列進行快排,然後從開始開始比較前後兩者是否相差1,相差1則計數...