📜  一个数组的最长子数组,它是另一个数组中的子序列(1)

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

一个数组的最长子数组,它是另一个数组中的子序列

问题描述

给定两个数组 nums1nums2,找到 nums1 中的最长子数组,使其也是 nums2 的子序列。可以假设两个数组中的所有元素都是非负整数。

解决方案

我们可以使用动态规划来解决这个问题。假设我们有两个指针 ij 分别指向 nums1nums2,一个变量 maxLen 记录当前的最长子数组的长度。

我们定义一个二维数组 dp,其中 dp[i][j] 表示 nums1 中前 i 个元素和 nums2 中前 j 个元素的最长子数组的长度。注意,这个子数组必须包含 nums1[i-1]

我们可以使用以下公式更新 dp

dp[i][j] = dp[i-1][j-1] + 1        if nums1[i-1] == nums2[j-1]
           max(dp[i][j-1], dp[i-1][j])   otherwise

最终,我们需要找到 dp 中的最大值,即可得到 nums1 中的最长子数组的长度。具体实现如下:

def findLength(nums1: List[int], nums2: List[int]) -> int:
    m, n = len(nums1), len(nums2)
    dp = [[0] * (n+1) for _ in range(m+1)]
    maxLen = 0
    for i in range(1, m+1):
        for j in range(1, n+1):
            if nums1[i-1] == nums2[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            maxLen = max(maxLen, dp[i][j])
    return maxLen
时间复杂度

该算法的时间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为两个数组的长度。

空间复杂度

该算法的空间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为两个数组的长度。