LEETCODE 300 最長上公升子串行

2021-09-24 23:25:28 字數 1258 閱讀 4645

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

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

輸出: 4 

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

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

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

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

法一:「動態規劃」  以當前位置元素為結尾作為狀態,作為狀態轉移方程

dp[i]=max(dp[j])+1  if jnums[j]

class solution(object):

def lengthoflis(self, nums):

""":type nums: list[int]

:rtype: int

"""# dp解決 狀態:以當前i為結尾的最長遞增子串行 dp[i]=max(dp[j])+1 if jnums[j]

if not nums:return 0

n=len(nums)

if n==1:return 1

dp=[1]*(n)

for i in range(1,n):

temp=0

# 可改為二分查詢 o(nlogn)

for j in range(i):

if nums[j]法二:但對於有序陣列的查詢,採用二分法 o(nlogn) 

class solution(object):

def lengthoflis(self, nums):

""":type nums: list[int]

:rtype: int

"""# 定義乙個二分查詢

def binary_seach(nums,target):

'''返回target在nums中按公升序的位置

'''n=len(nums)

i,j=0,n-1

while i<=j:

mid=(i+j)//2

if nums[mid]==target:return mid

elif nums[mid]dp[-1]:

max_len+=1

else:

temp=binary_seach(dp,nums[i])

dp[temp]=nums[i]

return max_len

LeetCode300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 題目分析 方法一 動態規劃,用dp i 表示以nums i 結尾的最長上公升子串行。那麼如何求dp i 呢,只要看n...

Leetcode 300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解題思路 1.普通演算法 動態規劃。假設陣列的前n個數...

leetcode 300 最長上公升子串行

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