leetcode数组汇总_[LeetCode] 300. 最长上升子序列
生活随笔
收集整理的這篇文章主要介紹了
leetcode数组汇总_[LeetCode] 300. 最长上升子序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接: https://leetcode-cn.com/problems/longest-increasing-subsequence
難度:中等
通過率:43.0%
題目描述:
給定一個無序的整數數組,找到其中最長上升子序列的長度。
示例:
輸入: [10,9,2,5,3,7,101,18] 輸出: 4 解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。說明:
- 可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。
- 你算法的時間復雜度應該為 $O(n^2)$ 。
進階: 你能將算法的時間復雜度降低到 $O(nlog n)$ 嗎?
思路:
思路一:動態規劃
dp[i]表示以nums[i]結尾的最長上升子序列
動態方程:dp[i] = max(dp[i], dp[j] + 1) j < i
時間復雜度:
空間復雜度:
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:n = len(nums)dp = [1] * nfor i in range(1, n):for j in range(i):if nums[j] < nums[i]:dp[i] = max(dp[i], dp[j] + 1)#print(dp)return max(dp or [0])思路二:二分法
我們建立一個數組有序(遞增)arr,記錄遍歷的數組。
當遍歷的數比arr最后一個數還有大,添加到arr末尾
當遍歷的數比尾數小,有二分法找到arr的位置,覆蓋
最后返回arr的長度即可。arr數組不一定是真實的最長上升子序列。
大家可以有例子模擬一下!
時間復雜度:
空間復雜度:
class Solution:def lengthOfLIS(self, nums: List[int]) -> int:import bisectarr = []for num in nums:loc = bisect.bisect_left(arr, num)arr[loc:loc + 1] = [num]# print(arr)return len(arr)更多題解:
九四干:[LeetCode] 題目匯總(持續更新)?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的leetcode数组汇总_[LeetCode] 300. 最长上升子序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring配置AOP切入点execut
- 下一篇: 液压滑环的特点讲解