300 最長上公升子串行

2021-10-02 16:01:03 字數 1774 閱讀 9743

參考解答:動態規劃 、貪心演算法 + 二分

思路1:動態規劃。

狀態:dp[i]表示以i對應元素結尾的序列的最長遞增子串行長度。

狀態轉移方程:對於第i個元素dp[i] = max(dp[i], dp[j] + 1) for j in [0, i),當比前面的元素大時,長度加1,但是還要在前面的多個遞增序列之間選出乙個最長的。

時間複雜度 o(n2)

空間複雜度 o(n)

# 初始化為1,本身長度為1

for i in

range

(n):

for j in

range

(i):

# 與前面每個j都要比較,而不僅僅是i的前乙個

思路2:優化的動態規劃。

時間複雜度 o(nlogn)

空間複雜度 o(n)

class

solution

:def

lengthoflis

(self, nums: list[

int])-

>

int:

# 新的思路主要是記錄最長的子串行

n =len(nums)

if n<2:

return n

tails =

[nums[0]

]for i in

range(1

,n):

if nums[i]

>tails[-1

]:)continue

# 二分法

left,right =0,

len(tails)-1

while left<=right:

mid =

(left+right)//2

if tails[mid]

>=nums[i]

:# 注意 這兒一定要有等於

300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?思路 遍歷一遍給定陣列,維護乙個陣列dp,dp i ...

300 最長上公升子串行

建立dp表,dp i 表示含第i個數字的最長上公升子串行的長度 求dp i 時,向前遍歷找出比i元素小的元素j,則動態方程為dp i max dp i dp j 1 class solution object def lengthoflis self,nums size len nums if si...

300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10 9,2 5,3 7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o n2 高階 你能...