码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-01 23:27:54      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:输入   超过   @param   如何   ant   car   tabs   根据   min   

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)
                
                

 

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

标签:输入   超过   @param   如何   ant   car   tabs   根据   min   

原文地址:https://www.cnblogs.com/yunxintryyoubest/p/13028107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!