給定乙個未排序的整數陣列,找出最長連續序列的長度。
要求演算法的時間複雜度為 o(n)。
輸入:
[100,4
,200,1
,3,2
]輸出:
4解釋: 最長連續序列是 [1,
2,3,
4]。它的長度為 4。
對於在陣列中的元素i
,若i-1
或者i+1
也在陣列中,則它們在乙個連續序列中。但是同時考慮i-1
和i+1
就比較麻煩,而且在陣列中查詢元素的時間複雜度為o(n)
,不滿足題目要求。於是可以只考慮i+1
,這樣做的前提條件是找到每個連續序列的最小值,只在最小值的元素上進行遍歷。所有可以用下面的**來找到最小值:
for num in num_set:
if num -
1not
in num_set:
# 這裡是為了找到陣列中所有可能的連續序列的最小值
就是說只遍歷i-1
不在原陣列中存在的元素i
,這樣可以保證每個i都是連續序列的最小值。同時,把陣列轉換成集合,在集合中查詢的平均時間複雜度為o(1)
可以滿足題目要求。
class
solution
:def
longestconsecutive
(self, nums)
: longest_streak =
0 num_set =
set(nums)
# 轉換成集合同時去重,集合查詢的平均時間複雜度為o(1)
for num in num_set:
if num -
1not
in num_set:
# 這裡是為了找到陣列中所有可能的連續序列的最小值
current_num = num
current_streak =
1while current_num +
1in num_set:
# 找到連續子串行的最小值之後,這裡遍歷計算長度
current_num +=
1 current_streak +=
1 longest_streak =
max(longest_streak, current_streak)
# 更新最長連續子串行的長度
return longest_streak
**參考 128 最長連續序列 力扣
題意理解 給定乙個未排序陣列,求最大連續數字的長度。這個連續數字可以任意位置。問題分析 方法1 排序 遍歷 遍歷要點是記錄連續的數字,我用的方法是和前一位比,如果比前一位大1,長度 1,如果相等,不做處理,其他情況,拿當前長度更新最大值,重置當前值為1.方法複雜度是o nlogn 方法2 集合 遍歷...
LeetCode 力扣 128 最長連續序列
給乙個陣列,求出連續的數字最多有多少個,時間複雜度要求是o n 首先想一下最直接的暴力破解。我們可以用乙個hashset把給的陣列儲存起來。然後再考慮陣列的每個數,比如這個數是n,然後看n 1在不在hashset中,然後再看n 2在不在,接下來n 3 n 4直到在hashset中找不到,記錄當前的長...
力扣第128題最長的連續序列
128.最長連續序列 難度 困難 標籤 並查集 給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。思路 運用並查集,使用hashmap fatherset k...