【Leetcode 题中总结的编程思维】Maximum Product Subarray,最大乘积子序列

152. Maximum Product Subarray

Medium

167677FavoriteShare

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example 1:

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2:

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

answer:

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = []
        max_min  = [(nums[0], nums[0])]
        
        for num in nums[1:]:
            if num > 0:
                temp = (max(num, num*max_min[-1][0]), min(num,  num*max_min[-1][1]))
            else:
                temp = (max(num, num*max_min[-1][1]), min(num,  num*max_min[-1][0]))
            max_min.append(temp)
        #print(max_min)
        return max(max_min)[0]
            

思考:

# 这种序列最值问题如下思考过程:
# 1. 序列中每一个位置为终点都有最优解,正常的情况是当前位置的最优解,应该从前边的所谓位置的最优解和本位置值中,求出来的,但是本题由于是连续的子序列,再前面的位置和当前位置,已经是不连续的了,所以只能前一个位置为终点的最优解和当前位置值中, 求出本位置最优解。
# 2. 那我们再思考本位置的最优解,需要上一个位置的什么解来获得。如本题,本位置为的负数时, 最大乘积需要上一个位置的最小乘积
# 3. 再根据不同的题的情况求最后的答案,如果是贪心的,最后一个位置的最优解就是题的最优解 但本题动态规划,可能是在序列中间位置为子序的结尾时,得到最优解。所以每一个位置的最优解都要进行保存。最后比较所有位置

你可能感兴趣的:(leetcode,dp,leetcode,动态,最大乘积子序列)