Leetcode152 Maximum Product Subarray 乘积最大子序列

在这里插入图片描述

思路:

   利用动态规划,
       如果是累加,则只需要判断a[i]是否大于a[i]+total(a[i]之前所有数的加和),每一次的最大值存入lst中,最后输出max(lst)
       但是对于乘积,也需要考虑负数负负得正的情况。所以需要判断两次,a[i]是否大于max(total_min * nums[i],total_max * nums[i]),或者小于min(total_min * nums[i],total_max * nums[i]),每一次的最大值和最小值分别存入lst_max,lst_min中,最后输出lst_max,lst_min中的最终的唯一最大值。

注意:

        判断的时候需要引入一个暂时变量temp_max/temp_min,避免min(nums[i],min(total_min * nums[i],total_max * nums[i])) 在判断时,total_max已经变成了这一次迭代的结果。我们需要的是上一次迭代中的total_max和total_min。

    def maxProduct(self, nums: List[int]) -> int:
        total_max=nums[0]
        total_min=nums[0]
        lst_max=[total_max]
        lst_min=[total_min]
        for i in range(1,len(nums)):
            
            temp_max=max(nums[i],max(total_min*nums[i],total_max*nums[i]))                   
            temp_min=min(nums[i],min(total_min*nums[i],total_max*nums[i]))
            
            total_max=temp_max
            total_min=temp_min
            
            lst_max.append(total_max)
            lst_min.append(total_min)
        
        return max(max(lst_max),max(lst_min))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值