📜  任意元素减 1 N 次后数组的最大乘积(1)

📅  最后修改于: 2023-12-03 15:36:23.382000             🧑  作者: Mango

任意元素减 1 N 次后数组的最大乘积

有一个长度为 N 的正整数数组,每个元素可以任意减小 1 次(即减 0 次或 1 次),求经过若干次操作后得到的数组的最大乘积。

思路

考虑将数组中所有元素都减去 1,则问题就转化为了在新数组中选取若干个元素,使其乘积最大。

如果新数组中没有 0 元素,则最优解是将新数组中的所有元素都选取,即最终乘积为 $(\prod_{i=1}^n a_i) / 2^n$。

如果新数组中有 1 个 0 元素,则需要将该元素以外的所有元素都选取,即最终乘积为 0。

如果新数组中有 2 个或以上的 0 元素,则最终乘积仍为 0。

如果新数组中有偶数个负数元素,则将它们全部变成正数;如果有奇数个负数元素,则将其中绝对值最小的一个变成正数。

最后对新数组中的所有元素求积即可。

代码实现
def max_product(nums):
    n = len(nums)
    negatives = 0
    has_zero = False
    min_abs_negative = float('inf')
    prod = 1
    for num in nums:
        if num < 0:
            prod *= -num
            negatives += 1
            min_abs_negative = min(min_abs_negative, abs(num))
        elif num > 0:
            prod *= num
        else:
            has_zero = True
    if has_zero:
        return 0
    elif negatives % 2 == 0:
        return prod // (2 ** negatives)
    else:
        return prod // (2 ** (negatives - 1)) // min_abs_negative
示例
>>> max_product([1, 2, 3, 4, 5])
120
>>> max_product([-1, 2, 3, 4, -5])
240
>>> max_product([1, 1, 2, 3, 0, -2])
0