這裡是題目描述: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+2
、x+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+1
、x+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則計數...