191. 乘积最大子序列(两个最值型动态规划)

191. 乘积最大子序列

中文English

找出一个序列中乘积最大的连续子序列(至少包含一个数)。

样例

样例 1:

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

样例 2:

输入:[-1,2,4,1]
输出:8

注意事项

数组长度不超过20000
乘积最大的子序列的积,小于2147483647 

输入测试数据 (每行一个参数)如何理解测试数据?
class Solution:
    """
    @param nums: An array of integers
    @return: An integer
    """
    '''
    大致思路:
    1.最值型动态规划,dp[j] 需要保证前面的是最大或者是最小,乘积,然后最后根据这个前面的最值乘积相差(注意,是子序列,不要求连续)
    同时保留两个极值
    如果a[j]是正数,我们希望以a[j-1]结尾的连续子序列乘积最大
    如果a[j]是负数,我们希望以a[j-1]结尾的连续子序列乘积最小

    '''
    def maxProduct(self, nums):
        if not nums:return 0

        #
        l = len(nums)
        #每次放入的是最大值f,每次放入的是最小值g
        f = [0]*l
        g = [0]*l

        for i in range(l):
            f[i] = g[i] = nums[i]

            #注意,i > 0是避免i - 1 越界,上面i = 0,一次赋值即可
            if (i > 0):
                #求最大,可能是--得到最大值的情况
                f[i] = max(f[i],max(f[i - 1]*nums[i],g[i - 1]*nums[i]))

                g[i] = min(g[i],min(g[i - 1]*nums[i],f[i - 1]*nums[i]))     
        
        #最后在取出最大值即可
        return max(f)
                
                

 

posted @ 2020-06-01 22:50  风不再来  阅读(201)  评论(0编辑  收藏  举报