300 最長上公升子串行(LIS的優化)

2021-10-02 22:09:55 字數 1003 閱讀 9017

300. 最長上公升子串行

這個題雖然是很早就做了,但是當初優化到o(nlogn),一直沒能理解。

dp[i]就表示以nums[i]結尾的最長上公升子串行的長度。

轉移方程:dp[i] = max (0 <= j < i )

時間複雜度:o(n^2)

class

solution

dp[i]

= max+1;

}int max =0;

for(

int i =

0; i < dp.length; i++

)return max;

}}

想法:外層遍歷是必須的,但內層迴圈目的就是為了找乙個最大的dp[j](0 <= j < i),不由自主的就想要是dp是乙個有序的,用二分查詢,把時間複雜度降到o(logn)多好,促使我們想乙個新的狀態表示方法。

優化:

將dp[i]描述為「長度為i的最長上公升子串行的最小結尾是多少」

tails陣列中的元素是嚴格遞增的。遍歷nums序列中的乙個元素nums[i]時,都有兩種情況:

nums[i] > tails[res],遍歷到的元素比 當前找到的最長的上公升子串行的最小結尾元素要大,那麼我們就找到了乙個更長的上公升子串行,並且結尾元素是當前遍歷到的元素

nums[i] <= tails[res],用折半查詢更新dp陣列中的某個元素。

(如果要找的是非遞減的上公升子串行,那麼第一種判斷條件應該是》=,第二個<)

兩種情況,第一種時間複雜度為o(1),第二種由於採用了折半查詢,時間複雜度為o(logn)

總時間複雜度o(nlogn),空間複雜度o(n)

class

solution

tails[i]

= num;

if(res == j) res++;}

return res;

}}

300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?思路 遍歷一遍給定陣列,維護乙個陣列dp,dp i ...

300 最長上公升子串行

建立dp表,dp i 表示含第i個數字的最長上公升子串行的長度 求dp i 時,向前遍歷找出比i元素小的元素j,則動態方程為dp i max dp i dp j 1 class solution object def lengthoflis self,nums size len nums if si...

300 最長上公升子串行

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