📅  最后修改于: 2023-12-03 14:48:53.492000             🧑  作者: Mango
本题目给定一个二维数组 nums
,其中 nums[i][j] 表示第i行第j列的数值,你需要从第一列中选择一个数,并从第二列中选择一个数,使得它们的乘积之和最大,返回最大值。
输入:
nums = [[1, 2], [3, 4]]
输出:
12
解释:
选择第一列的2和第二列的4,乘积之和为2 * 4 = 8。
我们可以用一个一维数组来保存到当前列的最大值,具体操作如下:
初始化一个长度为n的一维数组dp,记录到当前列的最大值,其中n为二维数组的行数。
对于每一列j,遍历第一列i,求出dp[i] + nums[i][j]的值,取其中的最大值赋值给dp[i]。
返回dp中最大的值,即为最大乘积之和。
代码实现如下:
def max_product(nums):
n = len(nums)
dp = [nums[i][0] for i in range(n)]
for j in range(1, len(nums[0])):
for i in range(n):
dp[i] = max(dp[i] * nums[i][j], nums[i][j])
for i in range(1, n):
dp[i] = max(dp[i], dp[i - 1])
return dp[-1]
代码解释:
第二行初始化了一个长度为n的dp数组,初始值为二维数组第一列的值。
外层循环遍历了除了第一列之外的所有列。
内层循环遍历了所有的行,对dp数组进行更新。假设当前在第j列第i行,那么就取dp[i] * nums[i][j]和nums[i][j]的最大值赋值给dp[i]。
遍历完第j列后,需要对dp数组进行一次更新,把dp数组中相邻两个数中的较大值赋值给右边的数,以保证下一次乘积时能够正确计算。
最后返回dp中的最大值即可。
本题目的思路是用dp数组记录到当前列的最大值,然后依次遍历每一列,更新dp数组。难度不算过高,适合初学者。