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 高階 你能...