📅  最后修改于: 2023-12-03 15:26:11.557000             🧑  作者: Mango
在一个整数数组中,找到一个大小为4的子序列,使得它们的乘积最大。返回这个最大的乘积。
我们可以先将数组中的数按照绝对值从大到小排序,然后再使用动态规划思想求解。设 $f(i,j)$ 表示前 $i$ 个数选 $j$ 个元素的最大乘积,$g(i,j)$ 表示前 $i$ 个数选 $j$ 个元素的最小乘积。考虑转移方程:
$$ f(i, j) = \max(f(i-1, j), f(i-1, j-1)\times a_i, g(i-1, j-1)\times a_i) $$
$$ g(i, j) = \min(g(i-1, j), f(i-1, j-1)\times a_i, g(i-1, j-1)\times a_i) $$
其中,$a_i$ 表示数组中的第 $i$ 个数。
def maxProductFour(nums) -> int:
nums.sort(reverse=True, key=abs)
n = len(nums)
f = [[0] * 5 for _ in range(n+1)]
g = [[0] * 5 for _ in range(n+1)]
f[0][0] = g[0][0] = 1
for i in range(1, n+1):
for j in range(1, min(i, 4)+1):
f[i][j] = max(f[i-1][j], f[i-1][j-1]*nums[i-1], g[i-1][j-1]*nums[i-1])
g[i][j] = min(g[i-1][j], f[i-1][j-1]*nums[i-1], g[i-1][j-1]*nums[i-1])
return f[n][4]
对数组排序的时间复杂度为 $O(n\log n)$,动态规划求解的时间复杂度为 $O(n)$,因此总时间复杂度为 $O(n\log n)$。
动态规划中使用了二维数组,空间复杂度为 $O(n)$。