0
点赞
收藏
分享

微信扫一扫

152. 乘积最大子数组


Title

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

示例 1:

输入: [2,3,-2,4]

输出: 6

解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]

输出: 0

解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

Solve

动态规划

如果当前位置是一个负数的话,那么我们希望在它前面一个位置的某一段的积也是个负数,并且尽可能小,负负得正。

如果当前位置是一个正数的话,那么我们希望它前面一个位置的某一段的积也是个正数,并且希望它尽可能大。

这样,我们可以维护一个f​max​(i)和f​min​(i),分别表示以第i个元素结尾的最大(小)乘积的子数组的乘积。

152. 乘积最大子数组_子数组1)

152. 乘积最大子数组_子数组_02

它代表第i个元素结尾的乘积最大子数组的乘积f​max​(i),可以考虑吧a​i​加入第i-1个元素结尾的乘积最大或最小的子数组的乘积中,二者加上a​i​,三者取大。

第i个元素结尾的乘积最小子数组的乘积f​min​(i)同理。

由于第i个状态只和第i-1个状态有关,根据【滚动数组】思想,可以只用f​max​(i)和f​min​(i)两个变量来维护i-1时刻的状态。

Code

class Solution:
def maxProduct(self, nums: List[int]) -> int:
maxF, minF, ans = nums[0], nums[0], nums[0]
for i in range(1, len(nums)):
mx, mn = maxF, minF
maxF = max(mx * nums[i], max(mn * nums[i], nums[i]))
minF = min(mn * nums[i], min(mx * nums[i], nums[i]))
ans = max(ans, maxF)
return ans



举报

相关推荐

0 条评论