📜  数组中的最大乘积四倍(大小为4的子序列)(1)

📅  最后修改于: 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)$。

相关题目