###152. Maximum Product Subarray
题目: https://leetcode.com/problems/maximum-product-subarray/
难度: Medium
思路:
粗一看, 一股浓烈的DP气息飘来,想要套用53题的思路和方程。但是这个跟sum是不一样的,因为乘积可以正负正负的跳,这样的动归方程肯定是不对的
dp[i] = max(dp[i-1] * a[i],a[i])
举个例子 : [-2,3,-4]
用O(N^2)超时,厉害啊!
想,可不可以记录+的和-的,记录两个dp数组,我哭了,真的是这样做的
最大值可能来源于最小值 -> 哲学般的句子
class Solution(object):
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
maxdp = [ nums[0] for i in range(n)]
mindp = [ nums[0] for i in range(n)]
for i in range(1,n):
maxdp[i] = max(mindp[i-1]*nums[i], maxdp[i-1]*nums[i],nums[i])
mindp[i] = min(maxdp[i-1]*nums[i], mindp[i-1]*nums[i],nums[i])
return max(maxdp)