LeetCode 300 最長上公升子串行

2022-06-22 05:00:10 字數 1283 閱讀 2816

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

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

輸出: 4

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

說明:

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

動態規劃法

第一步,定義狀態。設 dp[i] 為第 i 個數時的最長上公升子串行的長度。

第二步,設定狀態轉移方程。對於 dp[i] ,設 j由於是雙層迴圈,所以時間複雜度是 \(o(n^2)\) 。

二分查詢法

本題用動態規劃時的時間複雜度是 \(o(n^2)\) ,而高階中要求的將時間複雜度降到 o(nlogn) ,顯然不能用動態規劃了。

可以利用以空間換時間的思想來解決。第一步,設定乙個用來放最長上公升子串行的列表 lis ;第二步,對 nums 進行遍歷,將元素 nums[i] 放入 lis 的可能情況為:對 lis 進行二分查詢,若 nums[i] > lis[-1] ,則直接加入到 lis 列表中,否則替換 lis 中的元素;最後求得 lis 的長度就是要返回的值。

由於只用了一層迴圈且二分查詢的時間複雜度為 o(logn) ,所以該方法的時間複雜度為 o(nlogn) 。

class solution(object):

def lengthoflis(self, nums):

""":type nums: list[int]

:rtype: int

"""# 二分查詢 返回陣列索引

def binarysearch (arr, x):

if not arr or len(arr) == 0:

return 0

low = 0

high = len(arr) - 1

while low <= high:

mid = (low + high) // 2

if arr[mid] < x:

low = mid + 1

else:

high = mid - 1

return low

lis =

for i in range(len(nums)):

index = binarysearch(lis, nums[i])

if index == len(lis):

else:

lis[index] = nums[i]

return len(lis)

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...