最长递增子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
leetcode
题目分析:
- 求最长递增子序列长度,且子序列无需连续
- 动态规划:构建一维dp,dp[i]表示以nums[i]结尾时,从nums[0:i]的最长上升子序列的长度
- 初始化dp[i]为1,表示最长递增子序列只有nums[i]一个
- 遍历nums:dp[i] = max(dp[j] + 1),0<=j<i,nums[j] < nums[i]
- 此方法时间复杂度为O(NN),若要优化为O(NlogN),则使用二分查找
# 动态规划:构建一维dp,dp[i]表示以nums[i]结尾时,从nums[0:i]的最长上升子序列的长度
# dp[i] = max(dp[j] + 1),0<=j<i,nums[j] < nums[i]
# 此方法时间复杂度为O(N*N),若要优化为O(N*logN),则使用二分查找
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
if nums is None or len(nums) == 0:
return 0
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j]+1)
# print(dp)
return max(dp)