天天看点

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 
        if len(nums) == :
            return nums[]
        middle = [nums[]]
        for i in xrange(, len(nums)):
            if nums[i] != :
                if max(middle) * min(middle) < :
                    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 = []
        return max(nums)