"""
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例輸入: [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 高階 你能...