300 最長上公升子串行

2021-10-02 00:27:22 字數 2456 閱讀 5707

"""

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

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

輸出: 4

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

說明:可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n2) 。

高階: 你能將演算法的時間複雜度降低到 o(n log n) 嗎?

"""# 方法一 動態規劃

# 時間複雜度要求達到 o(nlogn)?? 意味著什麼?。。意味著可能需採用二分查詢

deflengthoflis1

(nums)

: n =

len(nums)

dp =[1

]* n

for i in

range(1

, n)

:for j in

range

(i):

if nums[j]

< nums[i]

: dp[i]

=max

(dp[i]

, dp[j]+1

)return

max(dp or[0

])# 方法二 二分法

deflengthoflis2

(nums)

: tails, res =[0

]*len(nums),0

for num in nums:

i, j =

0, res

while i < j:

m =(i+j)//2

if tails[m]

< m:

i = m+

1else

: j = m

tails[i]

= num

if j == res:

res +=

1return res

deflengthoflis3

(nums)

:#時間複雜度為o(n * log(n))

# if not nums: return 0

tails =

[float

('-inf')]

*len

(nums)

res =

0for num in nums:

if num > tails[res -1]

: tails[res]

= num

res +=

1continue

left, right =

0, res -

1while left < right:

mid =

(left + right)//2

if num <= tails[mid]

: right = mid

else

: left = mid +

1 tails[right]

= num

return res

class

solution

:def

lengthoflis

(self, nums: list[

int])-

>

int:

# 堆數 piles = len(top)

top =

# 堆頂元素陣列

for poker in nums:

# poker 當前牌

# find left bound

# 其實質是right往left方向靠

left =

0 right =

len(top)

while left < right:

mid =

(left + right)//2

if top[mid]

== poker:

right = mid

elif top[mid]

< poker:

left = mid +

1elif top[mid]

> poker:

right = mid

# "left" is the left bound

if left ==

len(top)

:else

: top[left]

= poker

return

len(top)

nums =[10

,9,2

,5,3

,7,101,18

]print

(lengthoflis1(nums)

)

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 高階 你能...