📅  最后修改于: 2023-12-03 14:55:19.055000             🧑  作者: Mango
给定一个整数数组,找到其中最长的严格递增子序列的长度。
序列可以是原始数组的连续子序列,也可以是不连续的子序列,即在原始数组中按照顺序选取其中某些数字组成一个新的数组。
给定数组 nums = [10, 9, 2, 5, 3, 7, 101, 18]
,其中最长的严格递增子序列是 [2, 5, 7, 101]
,因此输出为 4
。
我们可以使用动态规划来解决本问题。
用 dp[i]
表示以第 i 个元素为结尾的最长递增子序列的长度。我们需要在 0 ≤ j < i
的所有 dp[j]
中找到小于 dp[i]
的最大值(如果不存在小于 dp[i]
的 dp[j]
,则令最大值为 0),并将其加1。这样得到的 dp[i]
即是以第 i 个元素为结尾的最长递增子序列的长度。
具体地,我们从左到右遍历给定的数组,随后对于每个位置 i
,我们从右到左枚举在 i
之前的每个位置 j
,如果满足 nums[j] < nums[i]
,那么 nums[i]
可以接在 nums[j]
后面形成一个比当前 dp[i]
更长的递增子序列,即 dp[j] + 1 > dp[i]
,此时更新 dp[i] = dp[j] + 1
。
最终,所有 dp[i]
中的最大值即为所求答案。
def length_of_lis(nums: List[int]) -> int:
n = len(nums)
if n < 2:
return n
dp = [1] * n
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
时间复杂度:$O(n^2)$,其中 $n$ 为数组的长度。
本文介绍了最大化给定数组中最长递增子序列的长度问题,并给出了使用动态规划解决此问题的代码实现。该问题是经典的 LIS(Longest Increasing Subsequence)问题,也是一类动态规划问题的模板。