📌  相关文章
📜  给定数组中最长递增素数子序列的长度(1)

📅  最后修改于: 2023-12-03 15:11:40.360000             🧑  作者: Mango

给定数组中最长递增子序列的长度

在计算机科学中,最长递增子序列(Longest Increasing Subsequence,简称LIS)是一个经典计算机科学问题,它是指在一个无序的序列中,找到一个尽可能长的由低到高排列的子序列,这个子序列不一定是连续的。

本文将介绍如何通过动态规划求解给定数组中最长递增子序列长度。

算法思路

假设dp[i]表示以nums[i]为结尾的最长递增子序列的长度,则有以下状态转移方程:

$$ dp[i] = \max_{0 \le j<i}{dp[j]+1} $$

其中,$j < i$ 并且 $nums[j] < nums[i]$,也就是说,对于 j 位置的元素,只有在其小于 i 位置的元素时,才可以将 j 的最长递增子序列的长度加上 1 后,得到 i 位置的最长递增子序列的长度。最终,我们需要找到所有 dp 数组中的最大值,就是给定数组中最长递增子序列的长度。

代码实现
def lengthOfLIS(nums: List[int]) -> int:
    if not nums:
        return 0
    n = len(nums)
    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)$。