[LeetCode]152. Maximum Product Subarray

152. Maximum Product Subarray

前提:一开始没有想到DP,而是想到了用递归,为了要考虑到可能会出现多个负数,基本上是遍历每一种情况,很是复杂。

假定dp[i]表示从起始到该下标的乘积的最值。

思路:我们需要使用两个dp,一个纪录最小值,一个纪录最大值,相互利用更新得到最小值和最大值,再用一个变量来维护最大值的结果即可。

动态规划

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        min_dp = [0] * len(nums)
        max_dp = [0] * len(nums)
        min_dp[0] = max_dp[0] = nums[0]
        res = nums[0]
        for i in range(1, len(nums)):
            ma = max_dp[i - 1]
            max_dp[i] = max(nums[i], max(max_dp[i - 1] * nums[i], min_dp[i - 1] * nums[i]))
            min_dp[i] = min(nums[i], min(ma * nums[i], min_dp[i - 1] * nums[i]))
            res = max(res, max_dp[i])
        return res

上面我是故意使用了动态规划,其实你也可以不使用动态规划数组来维护,只使用两个变量也是可以的,不过它们的思想都是动态规划的思想罢了。

posted @ 2017-08-20 04:57  banananana  阅读(144)  评论(0编辑  收藏  举报