128. 最長連續序列
給定乙個未排序的整數陣列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
考慮到本題是求解最長連續序列,這與以前的子串行問題有點不同,這裡的連續指的是數字本身大小的連續,所以可能使用動態規劃有一定困難。
這題可以從另乙個角度思考問題,因為總共輸入的序列是定長的,只有這麼多的元素在陣列中,所以,我們可以先把這些元素存入hashmap中,表示元素是否存在。對於連續元素,則可以依次遞增當前元素num,並判斷遞增後的元素是否也出現在hashmap中,如果出現則以當前元素開始的序列長度增一。
此外,本題需要滿足時間複雜度為\(o(n)\),所以使用列舉的方法可能會不滿足條件,而且裡面有很多情況是重複考慮的了。比如說,之前已經判斷了num, num+1,num+2,...,num+n,那麼下一次從num+1開始到num+n的元素就不需要再判斷了,因為這些元素已經存在hashmap中了。
最後,本題需要注意的乙個地方是,需要使用hashset來去重,這裡的連續元素指的是嚴格連續,不包括重複元素。
class solution
int maxlength = 0;
for(int num : nums)
maxlength = math.max(maxlength, length);}}
return maxlength;}}
前面也提到了,本題與以前的子串行問題有點不同,使用動態規劃可能比較困難,也很難想到狀態轉移方程。但是,這並不意味著不能使用動態規劃。
這是一種非常巧妙的做法,與思路2相同的一點是也利用了map減小遍歷次數。但很重要的一點不同是其value表示的是num所在的連續區間長度。舉個例子,當map的key為5,value為3時,這就表明當前有乙個包含5且長度為3的連續區間,當然有多種可能,可以是[3,5],[4,6],[5,7]。
具體做法是:
3.1 遍歷nums陣列中的所有數字num
3.2 當num是第一次出現時:
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則計數...