300 最長上公升子串行

2021-09-26 18:10:58 字數 1164 閱讀 7722

建立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 size <= 1:

return size

dp = [1] * size

for i in range(1, size):

for j in range(i):

if nums[i] > nums[j]:

# + 1 的位置不要加錯了

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

# 最後要全部走一遍,看最大值

return max(dp)

利用乙個cell陣列,用於儲存最長上公升子串行

對原序列進行遍歷,將每位元素二分插入cell中:

總之,思想就是讓 cell 中儲存比較小的元素。這樣,cell 未必是真實的最長上公升子串行,但長度是對的。

class solution(object):

def lengthoflis(self, nums):

size = len(nums)

if size <= 1:

return size

cell = [nums[0]]

for i in nums[1:]:

#cell中元素都比它小

if i > cell[-1]:

continue

#否則,利用二分查詢,進行覆蓋

l, r = 0, len(cell) - 1

while l < r:

m = l + (r - l) // 2

if cell[m] < i:

l = m + 1

else:

r = m

cell[l] = i

return len(cell)

300 最長上公升子串行

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

300 最長上公升子串行

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

300 最長上公升子串行

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