leetcode 152 乘积最大子序列

描述:

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

示例 1:

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

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 由于 [-2,-1] 不是子数组。
复制代码

思路:

这道题能够动态规划的方法解决。

DP定义:min[i] max[i],用来存i位置时,乘积的最大子序列/最小子序列。由于有负数的存在,因此不能只存最大值,还要存最小值。bash

DP方程:ui

if(i > 0){
  max[i+1] = max[i]*(i+1);
  min[i+1] = min[i]*(i+1);
}else{
  max[i+1] = min[i]*(i+1);
  min[i+1] = max[i]*(i+1);
}复制代码

代码:

class Solution {
  public int maxProduct(int[] nums) {
    int[] min = new int[nums.length];
    int[] max = new int[nums.length];
    min[0] = nums[0];
    max[0] = nums[0];
    int res = nums[0];
    for (int i = 1; i < nums.length; i++) {
      min[i] = Math.min(Math.min(min[i - 1] * nums[i], max[i - 1] * nums[i]), nums[i]);
      max[i] = Math.max(Math.max(max[i - 1] * nums[i], min[i - 1] * nums[i]), nums[i]);
      res = Math.max(res,max[i]);
    }
    return res;
  }
}
复制代码

结果:

相关文章
相关标签/搜索