码迷,mamicode.com
首页 > 编程语言 > 详细

乘积最大子数组

时间:2021-06-02 14:03:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:这不   info   inf   思考   最大   turn   rgba   mic   思想   

技术图片

 

 这一题我最开始走到了思维误区,认为应该把输入先按0切分开来,然后再考虑负数的情况。这种思维倒是符合正常的思维模式,但是思考到分开之后大量的子数组段保存需要较大空间,而且处理起来很复杂,这时候就应该思考一些别的思路而不是继续优化它了。

  动态规划的思想似乎在这道题的样子里若隐若现,可惜不是加和而是相乘,相乘最麻烦的问题不是0而是负数,如果一个子段中有负数很可能最大值就变成了最小值,最小值又变成了最大值,这种来来回回的变化可太烦人了。

  思考到这里就应该考虑到这种来来回回的变化似乎就是我们解题的关键了,如果我们能够将这种变化记录起来,我们就能知道每一时刻的最大值和最小值,这不正是我们需要的结果吗。

  那么就建立两个数组imax和imin,分别用来存到 i 为止的最大值和最小值不就可以了。

  对于imax和imin来说,最大或最小值只有两种情况中的最大和最小,分别是:1.当前值num[i]就是我的最大值或最小值    2.当前值能够和到 i-1 的最大最小值相乘以获得更大或更小的值。

  举个例子,当前值是7,我想求imax,那么可能7就是我当前位置的最大值(之前的最大值是负数,再乘7也是负数),或者当前值能够和 i-1的最大最小值相乘(之前的最大值是正数8,那么这个点最大值是7*8)。

  负数也是一样的,上代码:

  

nums = [2,3,-2,4]

class Solution:
    def cacu_max(self,nums):
        i_max = [nums[0]] #以i结尾乘积的最大值
        i_min = [nums[0]] #以i结尾乘积的最小值
        tmp = 1
        for i in range(1,len(nums)):
            i_max.append(max(nums[i],i_max[i-1]*nums[i],i_min[i-1]*nums[i]))
            i_min.append(min(nums[i],i_max[i-1]*nums[i],i_min[i-1]*nums[i]))
        return max(max(i_max),max(i_min))
so = Solution()
so.cacu_max(nums)

 

乘积最大子数组

标签:这不   info   inf   思考   最大   turn   rgba   mic   思想   

原文地址:https://www.cnblogs.com/snailbuster/p/14821010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!