乘积最大子数组较最大子数组和力扣-53.最大子数组和_Node_Su的博客-优快云博客最大的区别在于,负数*负数 = 正数
也就是当当前数为负数时,求以当前数结尾的 dp[i] 的最大值,有可能是要*前面的最小值(因为当前是负数)
因此需要多一个 dp_1 数组来存储最小值
class Solution(object):
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
dp = [1] * n
dp_1 = [1] * n
dp[0] = nums[0]
dp_1[0] = nums[0]
for i in range(1, n):
dp[i] = max(dp[i - 1] * nums[i], nums[i], dp_1[i - 1] * nums[i])
dp_1[i] = min(dp_1[i - 1] * nums[i], nums[i], dp[i - 1] * nums[i])
dp.extend(dp_1)
return max(dp)
if __name__ == '__main__':
nums = [1, 2, -1, -2, 2, 1, -2, 1, 4, -5, 4]
Sol = Solution()
res = Solution.maxProduct(Sol, nums)
print(res)