***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

 

posted @ 2019-08-15 17:18  三年一梦  阅读(140)  评论(0)    收藏  举报