給乙個陣列,求出連續的數字最多有多少個,時間複雜度要求是o(n)
。
首先想一下最直接的暴力破解。我們可以用乙個hashset
把給的陣列儲存起來。然後再考慮陣列的每個數,比如這個數是n
,然後看n + 1
在不在hashset
中,然後再看n + 2
在不在,接下來n + 3
、n + 4
直到在hashset
中找不到,記錄當前的長度。然後繼續考慮下乙個數,並且更新最長的長度。
public
intlongestconsecutive
(int
nums)
int max =0;
for(
int i =
0; i < nums.length; i++
) max = math.
max(max, count);}
return max;
}
當然時間複雜度不符合題意了,我們想一下優化方案。
上邊的暴力破解有乙個問題就是做了很多沒必要的計算,因為我們要找最長的連續數字。所以如果是陣列54367
,當我們遇到5
的時候計算一遍567
。遇到4
又計算一遍4567
。遇到3
又計算一遍34567
。很明顯從3
開始才是我們想要的序列。
換句話講,我們只考慮從序列最小的數開始即可。實現的話,當考慮n
的時候,我們先看一看n - 1
是否存在,如果不存在,那麼從n
開始就是我們需要考慮的序列了。否則的話,直接跳過。
public
intlongestconsecutive
(int
nums)
int max =0;
for(
int i =
0; i < nums.length; i++
) max = math.
max(max, count);}
}return max;
}
這個時間複雜度的話就是o(n)
了。雖然for
迴圈裡套了while
迴圈,但每個元素其實最多也就是被訪問兩次。比如極端情況987654
,98765
迴圈的時候都不會進入while
迴圈,只有到4
的時候才進入了while
迴圈。所以總共的話,98765
也只會被訪問兩次,所以時間複雜度就是o(n)
了。
參考 這裡 ,雖然不容易直接想到,但還是有跡可循的。
本質上就是把連續的序列進行合併,思路就是考慮我們先解決了小問題,然後大問題怎麼解決。
假如我們已經了有連續的序列,123 和 56,並且序列的邊界儲存了當前序列的長度。12
333<
- 序列長度56
22<
- 序列長度
此時來了乙個數字 4
我們只需要考慮 4-1
=3,以 3 結尾的序列的長度
以及 4+1
=5,以 5 開頭的序列的長度
所以當前就會得到乙個包含 4 的,長度為 3+1
+2=6 的序列12
3456
3322
<
- 序列長度
此時把兩個邊界的長度進行更新12
3456
6326
<
- 序列長度
此時如果又來了 7
我們只需要考慮 7-1
=6,以 6 結尾的序列的長度
以及 7+1
=8,以 8 開頭的序列的長度,但是不存在以 8 開頭的序列,所以這個長度是 0
所以當前就會得到乙個包含 7 的,長度為 6+1
+0=7 的序列 12
3456
7632
6<
- 序列長度
此時把兩個邊界的長度進行更新12
3456
7732
67<
- 序列長度
實現的話,我們可以用乙個hashmap
,儲存以當前key
為邊界的連續序列的長度。可以再結合**理解一下。
public
intlongestconsecutive
(int
nums)
//找到以左邊數字結尾的最長序列,預設為 0
int left = map.
getordefault
(num -1,
0);//找到以右邊數開頭的最長序列,預設為 0
int right = map.
getordefault
(num +1,
0);int sum = left +
1+ right;
max = math.
max(max, sum)
;//將當前數字放到 map 中,防止重複考慮數字,value 可以隨便給乙個值
map.
put(num,-1
);//更新左邊界長度
map.
put(num - left, sum)
;//更新右邊界長度
map.
put(num + right, sum);}
return max;
}
兩種思路其實都是正常的操作,仔細想的話還是可以想出來的。
更多詳細通俗題解詳見 leetcode.wang 。
128 最長連續序列 力扣
題意理解 給定乙個未排序陣列,求最大連續數字的長度。這個連續數字可以任意位置。問題分析 方法1 排序 遍歷 遍歷要點是記錄連續的數字,我用的方法是和前一位比,如果比前一位大1,長度 1,如果相等,不做處理,其他情況,拿當前長度更新最大值,重置當前值為1.方法複雜度是o nlogn 方法2 集合 遍歷...
力扣LeetCode 128題 最長連續序列
題目 給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。要找連續序列的長度,從結果可以看出,主要是為了排序,排序之後,遍歷結果就可以進行連續長度的更新。但是排...
力扣題解系列 128 最長連續序列
給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 輸入 100,4 200,1 3,2 輸出 4解釋 最長連續序列是 1,2,3,4 它的長度為 4。對於在陣列中的元素i,若i 1或者i 1也在陣列中,則它們在乙個連續序列中。但是同時考慮i 1和i 1就比較麻煩,而...