***152. 乘积最大子序列
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
思路: 作者:jyd
此题与53题类似,不同处是53题的运算是加法,本题是乘法。
对于加法,在遍历数组中始终取max(ma + nums[i], nums[i])即可,因为无论nums[i]的正负如何,
对与乘法,在遍历数组中,若nums[i]是负数,那么当前最大值ma * nums[i]会变成当前最小值(负数),因此不能简单的只记录最大值。
本题的解题思路是同时记录当前最大值和最小值ma, mi:
当nums[i]是正数时,ma, mi * nums[i]仍然是最大值,最小值;
当nums[i]是负数时,ma, mi * nums[i]将变成最小值, 最大值;
因此,当nums[i] < 0时,我们交换ma, mi。
在遍历nums过程中,每次更新res获取全局最大值。
class Solution:
def maxProduct(self, nums) -> int:
mi,ma,res = nums[0],nums[0],nums[0]
for i in range(1,len(nums)):
if nums[i]<0:
mi,ma = ma,mi
mi = min(mi*nums[i], nums[i])
ma = max(ma*nums[i], nums[i])
res = max(res,ma)
return res

浙公网安备 33010602011771号