📅  最后修改于: 2023-12-03 15:06:09.569000             🧑  作者: Mango
给定两个数组 nums1
和 nums2
,找到 nums1
中的最长子数组,使其也是 nums2
的子序列。可以假设两个数组中的所有元素都是非负整数。
我们可以使用动态规划来解决这个问题。假设我们有两个指针 i
和 j
分别指向 nums1
和 nums2
,一个变量 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$ 分别为两个数组的长度。