动态规划之三乘积最大子数组

题目描述:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

示例 1:
输入: [2,3,-2,4]            输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:
输入: [-2,0,-1]    输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

解题思路
这一题和最大子数组和不同的地方在于,加法只要累加就可以找到最大和,但是乘法会出现负负得正的场景。所以,当一个负数 × 负数的最小值,就能得到一个最大值。为了解决这种问题,需要同时记录最大值和最小值,最大值遇到负数会变成最小值,最小值遇到负数会变成最大值。

同时该题并不需要维护一个dp数组,因为最大值乘积是一个数值,并且这个数值只和当前数值与前一个最大值和最小值有关,所以维护一个最大值和一个最小值就能够完成求解。

def max_multiply(arr):

    max_value = arr[0]
    min_value = arr[0]
    res = arr[0]
    for i in arr[1:]:
        pre_max = max_value
        # 先求出最大值,再和当前值比较,找到最大值
        max_value = max(i, max(i*max_value,i*min_value))

        # 先求出最小值,在和当前值比较,找到最小值
        min_value = min(i, min(i*pre_max,i*min_value))
        res = max(max_value,min_value)
    return res
    
arr = [5,6,-3,4,-3]
res = max_multiply(arr)
print(res)
原文地址:https://www.cnblogs.com/goldsunshine/p/13941920.html