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