📜  门| GATE-CS-2005 |问题 6(1)

📅  最后修改于: 2023-12-03 14:58:26.871000             🧑  作者: Mango

问题 6: 给定一个数组,找到最长的增长子序列的长度

这是一道经典的动态规划问题。我们需要定义一个数组dp,dp[i]表示以第i个元素结尾的最长增长子序列。那么,我们可以得到dp[i]的递推公式:

dp[i] = max(dp[j] + 1), 其中0 <= j < i and nums[j] < nums[i]

意思是,如果当前元素nums[i]大于前面某个元素nums[j],那么以nums[j]结尾的最长增长序列再加上nums[i]就是以当前元素结尾的最长增长序列。

最后,我们只需要在dp数组中找到最大的那个数,就是我们要求的答案。

下面是代码片段:

def lengthOfLIS(nums: List[int]) -> int:
    if not nums:
        return 0
    n = len(nums)
    dp = [1] * n
    for i in range(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为数组的长度。如果使用二分查找,可以将时间复杂度降至O(nlogn)。