leetcode之Maximum Product Subarray

这还是一道动态规划的题。第n个数时,你需要比较的是这个数与前面的数依次相乘的最大值,这个最大值就是这个数位置的最大值。由于可能会出现0,所以最后的结果必然是对全部的list取最大值,这样就会得到最大的乘法子序列最大值。
但是这样的问题是很明显的,算法的复杂度是n的平方。会超时。仔细想想其实对于每次要乘的数来说,最大值一定出现在原list的最大值or最小值里面,亦或者是它自己本身。(共3种情况:一个正,一个负;一个正,一个0;一个负,一个0;)如果是一正一负的话,只要本身不是0,那么最大值一定产生在与它俩的积里面。带有0的情况单独分析。
class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if nums == []:
            return 0
        if len(nums) == 1:
            return nums[0]
        middle = [nums[0]]
        for i in xrange(1, len(nums)):
            if nums[i] != 0:
                if max(middle) * min(middle) < 0:
                    for j in xrange(len(middle)):
                        middle[j] = middle[j] * nums[i]
                    nums[i] = max(middle)
                else:
                    for j in xrange(len(middle)):
                        middle[j] = middle[j] * nums[i]
                    middle.append(nums[i])
                    nums[i] = max(middle)
                    middle = [nums[i], min(middle)]
            else:
                middle = [0]
        return max(nums)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值