leetcode 300 最長上公升子串行

2021-09-28 21:56:02 字數 1437 閱讀 3147

分析:動態規劃

定義: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...