这还是一道动态规划的题。第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)