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

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。动态规划之三乘积最大子数组,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

题目描述:给你一个整数数组 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,res)
    return res
    
arr = [5,6,-3,4,-3]
res = max_multiply(arr)
print(res)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/196596.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!