分析:動態規劃
定義:dp[0,…i-1] ,dp[i]定義為以num[i] 元素結尾的子串行的最大長度。
例如:
狀態轉移方程:
dp[i] = max( 1 + dp[j] if i > j and nums[i] > nums[j])
class
solution
(object):
deflengthoflis
(self, nums)
: dp =[1
]*len(nums)
iflen
(nums)
<1:
return
0for i in
range(1
,len
(nums)):
for j in
range
(i):
if nums[i]
>nums[j]
: dp[i]
=max
(dp[j]+1
,dp[i]
)return
max(dp)
解法二:二分法 + dp
新建陣列cell,用於儲存最長上公升子串行
對原序列進行遍歷,將每乙個元素二分插入cell 中。
- 如果cell 中元素都比它小,直接查到cell 最後.\
-否則,用它覆蓋比它大的元素中最小的那個。
總之,思想就是讓 cell 中儲存比較小的元素。這樣,cell 未必是真實的最長上公升子串行,但長度是對的。
def
lengthoflis
(self,nums):if
len(nums)==0
:return
0 cell =
[nums[0]
]for num in nums[1:
]:if num > cell[-1
]:continue
l,r =0,
len(cell)-1
while l < r :
mid = l +
(r - l )//2
if cell[mid]
< num:
l = mid +
1else
: r = mid
cell[l]
= num
return
len(cell)
LeetCode300 最長上公升子串行
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 題目分析 方法一 動態規劃,用dp i 表示以nums i 結尾的最長上公升子串行。那麼如何求dp i 呢,只要看n...
Leetcode 300 最長上公升子串行
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解題思路 1.普通演算法 動態規劃。假設陣列的前n個數...
leetcode 300 最長上公升子串行
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解法1 動態規劃空間複雜度o n 時間複雜度o n 2...