leetcode中等152乘积最大的子数组中等
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等152乘积最大的子数组中等相关的知识,希望对你有一定的参考价值。
思路:动态规划
易错:转移方程不是!!
不只和前一个数有关!!
比如[-2,3,-2],最大值应该是12,之和前一个有关的话就变成3了!
正确:
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此,不只须需要dp_max,还需要维护当前最小值dp_min,以供随时反转
class Solution:
def maxProduct(self, nums: List[int]) -> int:
l=len(nums)
dp_max=[-math.inf]*(l+1)
dp_min=[-math.inf]*(l+1)
dp_max[0] = dp_min[0] = 1;
max_res=-math.inf
for i in range(1,l+1):
#如果是负数,需要交换dp
if nums[i-1]<0:
dp_max[i-1],dp_min[i-1]=dp_min[i-1],dp_max[i-1]
dp_min[i] = min(nums[i - 1], dp_min[i - 1] * nums[i - 1]);
dp_max[i] = max(nums[i - 1], dp_max[i - 1] * nums[i - 1]);
max_res = max(max_res, dp_max[i])
return(max_res)
简化:不要dp数组,只需要imax,imin两个数维护就可以
class Solution:
def maxProduct(self, nums: List[int]) -> int:
l=len(nums)
imax=imin=1
max_res=-math.inf
for i in range(l):
#如果是负数,需要交换dp
if nums[i]<0:
imax,imin=imin,imax
imin=min(imin*nums[i],nums[i])
imax=max(imax*nums[i],nums[i])
max_res = max(max_res, imax)
return(max_res)
以上是关于leetcode中等152乘积最大的子数组中等的主要内容,如果未能解决你的问题,请参考以下文章