leetcode 題目300 最長上公升子串行

2021-10-03 20:54:06 字數 1118 閱讀 1300

2020/3/14  打卡

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

示例:輸入:

[10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是

[2,3,7,101],

它的長度是

4

感覺傳統思路就夠了,使用dp解法。

用dp[i] 表示 從下標0 到下標i 的最長上公升子串行的長度,例如對於樣例輸入[10,9,2,5,3,7,101,18], 

有 dp = [ 1, 1, 1, 2, 2, 3, 4, 4]。

顯然dp[0] = 1,對於任意的i 不為零的情況,應該在 i 的左側找乙個下標 j ,其滿足兩個條件:

1. nums[ j ]比 nums[ i ] 小

2. 它是所有滿足條件1裡 dp [j]  最大的那個

dp[i] = max(dp[j]) + 1 , j < i and nums[ j ] < nums[ i ]

如果不存在這樣的下標j,說明在0 ~ i - 1 的範圍內,所有元素都比nums[i] 大,即無法找到乙個能和 nums[i]

組成上公升子串行的元素,所以dp[i] = 1, 表示為nums[i] 自身成為乙個長度為1 的上公升子串行。

def fun1(nums):

# 邊界條件

l = len(nums)

if l <= 1:

return l

# 定義 狀態 明白其含義 dp[i] 表示 從下標0 到下標i 的最長上公升子串行的長度,也就是直接目標意義

dp = [1 for _ in range(l)]

# 設定狀態轉移

for i in range(1, l):

for j in range(i):

# 因為之前沒有 設定必須連續,所以可以這樣模糊的動態探索即可,能夠 有間隔的組成遞增序列。

if nums[i] > nums[j]:

dp[i] = max(dp[j] + 1, dp[i])

# 最後選擇 最大的狀態情況

return max(dp)

LeetCode 300 最長遞增子串行

300.最長遞增子串行 我們記狀態 dp i dp i dp i 表示以第 i ii 個元素結尾的最長上公升子串行的長度,那麼專一方程就可以定義為 dp i m ax d p j 1 0 j ndnu ms j ms i dp i max dp j 1 0 leq jdp i max dp j 1 ...

LeetCode300 最長遞增子串行

題目鏈結 題目描述 給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 輸入 nums 10,9,2,5,3,7,101,18 輸出 ...

leetcode 300 最長遞增子串行

思路,動態規劃 狀態含義 dp i 第i個元素所表示的最大的遞增序列長度 轉移方程 第i個是否可以放在第j個後面 1.可以放,dp i max dp i dp j 1 2.不可以放,跳過 遍歷dp找最大 class solution max max max,dp i return max inclu...