leetcode 動態規劃 最長連續序列

2021-10-07 13:11:56 字數 968 閱讀 2734

給定乙個未排序的整數陣列,找出最長連續序列的長度。

要求演算法的時間複雜度為 o(n)。

示例:

輸入:[100, 4, 200, 1, 3, 2]輸出:4解釋:最長連續序列是[1, 2, 3, 4]。它的長度為 4。
由於o(n)時間複雜度的限制,我們就不能採取先排序後遍歷的思路。

針對o(n)時間複雜度的實現思路:遍歷nums陣列,利用map儲存元素nums[i]的值以及其所在連續序列的長度,此時基本只有兩種情況:

陣列**現過元素nums[i]-1或nums[i]+1,意味著當前元素可以歸入左或右序列,那麼此時假如左右序列的長度分別為left、right,那麼顯然加入nums[i]後,這整段序列的長度為 1+left+right,而由於這一整段序列中,只可能在左右兩端擴充套件,所以只需要更新左右兩端的value值即可。

陣列中未出現過元素nums[i]-1或nums[i]+1,意味著當前元素所在的連續序列就是自身(只有自己乙個元素)。

但是!!總是有坑在等著我們跳:nums陣列存在重複數字。

假設nums 陣列為[2,4,3,3],按照上面的邏輯,map(key->value)中2->1,4->1,當遇到3時,因為左右兩端都存在,因此會直接更新2->2,4->2,再次遇到3,2->3,4->3,於是我們需要判斷是否已經處理過3這個重複數字,方法就是每次處理的數字nums[i],也在map中更新它的值,並且在遍歷的時候先判斷nums[i].value是不是0,如果不是0,那麼意味著前面我們處理過了,直接跳過就好。

class solution 

if(right != 0)

max = max>left+right+1?max:left+right+1;}}

return max;

}}

LeetCode 最長數對鏈(動態規劃)

給出 n 個數對。在每乙個數對中,第乙個數字總是比第二個數字小。現在,我們定義一種跟隨關係,當且僅當 b c 時,數對 c,d 才可以跟在 a,b 後面。我們用這種形式來構造乙個數對鏈。給定乙個對數集合,找出能夠形成的最長數對鏈的長度。你不需要用到所有的數對,你可以以任何順序選擇其中的一些數對來構造...

LeetCode動態規劃之最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。輸入 cbbd 輸出 bb 首先,必須要明確最長回文子串的含義,簡單來說就是 從前往後讀和從後往前讀 是一樣的,按照我們動態規劃解題3步驟 定義陣列元素含義,找...

LeetCode動態規劃 300最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o n2 高階 你能...