leetcode 第152题 乘积最大子序列 python解法

leetcode 第152题 乘积最大子序列 python解法

问题分析

在这里插入图片描述
题目的要求是在一个整数数组中找到乘积最大的一个连续子序列,数组里的数可正可负可零。
首先用一个具体的例子来讲解一下我的思路,假设所给的数组如下:
[2, -1, 4, -2, -3, 0, 1, 2]
先定义最大的数为数组的第一个元素,即2,并设置当前数为1。然后从左向右遍历,在没有遇到零之前,将遍历的数不管是正数还是负数都乘上当前数。如果当前数大于最大的数,那么将最大的数替换成当前数。如果遇到零,那么将当数重新设置为1,继续遍历。 等到遍历完数组后,所得到的最大数就是从左到右遍历的最大值。
细心的人可以发现,如果按照上述的方法对数组操作,那么最后得到的最大数为2 x (-1) x 4 x (-2) = 16。然而这并不是正确的结果,最终的答案应该是4 x (-2) x (-3) = 24。
那这是为什么呢?原因就是我只进行了从左向右的遍历。假设数组中包含有多个负数,像上面的数组一样,将它们之间的正数拿掉,负数的排列为-1, -2, -3。如果负数的个数是偶数还好办,完全不影响。但是是奇数时,就存在一个取舍的问题—即舍去第一个负数,还是最后一个负数。如果只进行从左到右的遍历,那么舍去的肯定将是最后一个负数,这样很可能得到错误的结果(例如上面)。怎样克服这个问题呢?很简单,在进行一次从右向左的遍历,并将遍历时得到的最大值与之前的最大值比较。
因为从左向右遍历和从右向左遍历在遇到同一列奇数个负数时,分别舍弃的正好是第一个和最后一个负数,这样的话就不会漏掉所有情况了。
还有一点要注意的是,上面说的一列负数的要求是负数之间是不存在零的,假如有零的话,就要分段考虑。

源码

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ret = nums[0]
        temp = 1
        for i in nums:
            temp *= i
            ret = temp if temp > ret else ret
            temp = 1 if temp == 0 else temp
        temp = 1
        for i in nums[::-1]:
            temp *= i
            ret = temp if temp > ret else ret
            temp = 1 if temp == 0 else temp
        return ret

感谢大家观看

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值