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


    题目描述:给你一个整数数组 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)
    
  • 相关阅读:
    洛谷-P1427 小鱼的数字游戏
    洛谷-P1047 校门外的树
    洛谷-P1046 陶陶摘苹果
    洛谷-P1980 计数问题
    洛谷-P1424 小鱼的航程(改进版)
    洛谷-P1423 小玉在游泳
    洛谷-P1035 级数求和
    洛谷-P1008 三连击
    Oracle 11g r2 rac +openfiler 2.99 安装
    26 主备库并行复制策略
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/13941920.html
Copyright © 2020-2023  润新知