Leetcode-152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

解法:1. 使用暴力解法。2. 使用dp策略,首先要做的还是定义dp[i][0]状态的含义,这里的状态指的是i位置向左,必须包含i的情况下,能够获得的最大值,相应的dp[i][0]指的就是包含i时向左能够获得的最小值,然后定义状态转移方程,如下图所示,也就是需要根据a[i]的值来进行调整。

  • Java
class Solution {
   
    public int maxProduct(int[] nums) {
   
        // 只需要用到dp[i-1]和dp[i],所以一直维持两个值存储dp[i-1]的最大最小值就可以了
        int curMin = nums[0], curMax = nums[0], res = nums[0];
        for (int i=1;i<nums.length;i++) {
   
            int tmp1 = nums[i]*curMax;
            int tmp2 = nums[i]*curMin;
            curMax = Math.max(tmp1>=tmp2?tmp1:tmp2, nums[i]);
            curMin = Math.min(tmp1>=tmp2?tmp2:tmp1, nums[i]);
            res = curMax>res?curMax:res;
        }
        return res;
    }
}
  • Python
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        curMin, curMax, res = nums[0],nums[0],nums[0]
        for i in range(1, len(nums)):
            tmp1 = nums[i]*curMax
            tmp2 = nums[i]*curMin
            curMax = max(tmp1,tmp2,nums[i])
            curMin = min(tmp1,tmp2,nums[i])
            res = curMax if curMax>res else res
        return res