給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
輸入: [10,9,2,5,3,7,101,18]定義 dp[輸出: 4
解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。
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...