LeetCode 300 最長上公升子串行

2021-10-05 22:12:35 字數 2021 閱讀 2475

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。

定義 dp[

i]

dp[i]

dp[i

] 為考慮前 i

ii 個元素,以第 i

ii 個數字結尾的最長上公升子串行的長度,注意 num

s[i]

nums[i]

nums[i

] 必須被選取。

我們從小到大計算 dpdp

dp陣列的值,在計算 dp[

i]

dp[i]

dp[i

] 之前,我們已經計算出 dp[

0…i−

1]

dp[0…i−1]

dp[0…i

−1] 的值,則狀態轉移方程為:

d p[

i]=m

ax(d

p[j]

)+1,

其中0≤

j

num[

j]

m[i]

dp[i]=max(dp[j])+1,其中0≤jdp

[i]=

max(

dp[j

])+1

,其中0

≤jnum[

j]m[i]

即考慮往 dp[

0…i−

1]

dp[0…i−1]

dp[0…i

−1] 中最長的上公升子串行後面再加乙個 num

s[i]

nums[i]

nums[i

]。由於dp[

j]

dp[j]

dp[j

]代表 num

s[0…

j]

nums[0…j]

nums[0

…j] 中以 num

s[j]

nums[j]

nums[j

] 結尾的最長上公升子串行,所以如果能從 dp[

j]

dp[j]

dp[j

] 這個狀態轉移過來,那麼 num

s[i]

nums[i]

nums[i

] 必然要大於 num

s[j]

nums[j]

nums[j

],才能將 num

s[i]

nums[i]

nums[i

] 放在 num

s[j]

nums[j]

nums[j

] 後面以形成更長的上公升子串行。

最後,整個陣列的最長上公升子串行即所有 dp[

i]

dp[i]

dp[i

] 中的最大值。

class

solution

:def

lengthoflis

(self, nums)

: n =

len(nums)

if n ==0:

return

0 dp =[1

for i in

range

(n)]

for i in

range(1

, n)

:for j in

range

(i):

if nums[j]

< nums[i]

: dp[i]

=max

(dp[j]+1

, dp[i]

)return

max(dp)

參見

solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti/

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...