📅  最后修改于: 2023-12-03 14:55:34.219000             🧑  作者: Mango
给定两个长度为 n 的整数数组 nums1 和 nums2,其中每个元素的绝对值都不超过 1000,找到两个数组中对应元素乘积的最大值,并返回这个最大值。
在两个数组中都插入一个零后,如果一个数组中的一个数字与另一个数组中的相同下标的数字相乘,则得到的乘积为 0。
这道题是一道经典的动态规划问题。我们可以使用一个两行 n+1 列的二维数组 dp,其中 dp[i][j] 表示 nums1 数组中前 i 个数字与 nums2 数组中前 j 个数字的最大点积。状态转移方程如下:
$$ dp[i][j] = max(dp[i-1][j-1]+nums1[i-1]*nums2[j-1], dp[i][j-1], dp[i-1][j]) $$
其中,dp[i-1][j-1]+nums1[i-1]*nums2[j-1] 表示选取 nums1 数组中第 i 个数字和 nums2 数组中第 j 个数字进行乘积运算,并加上之前的最大点积;
dp[i][j-1] 表示选择 nums2 数组的第 j 个数字不参与乘积运算;
dp[i-1][j] 表示选择 nums1 数组的第 i 个数字不参与乘积运算。
def maxDotProduct(nums1, nums2):
m, n = len(nums1), len(nums2)
dp = [[-1000000000] * (n + 1) for _ in range(2)]
for i in range(1, m+1):
for j in range(1, n+1):
dp[i%2][j] = max(dp[(i-1)%2][j-1]+nums1[i-1]*nums2[j-1], dp[i%2][j-1], dp[(i-1)%2][j])
return dp[m%2][n]
>>> nums1 = [2, 1, -2, 5]
>>> nums2 = [3, 0, -6]
>>> maxDotProduct(nums1, nums2)
18
本题是一道典型的动态规划问题,需要使用二维数组进行状态转移。使用 dp[i][j] 表示 nums1 数组中前 i 个数字与 nums2 数组中前 j 个数字的最大点积。状态转移方程为 dp[i][j] = max(dp[i-1][j-1]+nums1[i-1]*nums2[j-1], dp[i][j-1], dp[i-1][j])。在实现时,可以使用滚动数组来降低空间复杂度。