给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
引用自 https://blog.csdn.net/whuwangyi/article/details/39577455
使用DP,由于负数的存在,需要同时保存当前最大值和当前最小值,所以需要维护两个DP表,可以分别表示为dp_min和dp_max。所以即为dp_max里的最大值。
这题里需要维护的当前最大值和当前最小值,都是在dp_min[i-1] * A[i],dp_max[i] * A[i],和A[i]这三者里面取一即可。
class Solution {
public int maxProduct(int[] nums) {
int max = nums[0];
int[] dp_min = new int[nums.length];
int[] dp_max = new int[nums.length];
dp_min[0] = dp_max[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
dp_min[i] = Math.min(Math.min(dp_min[i-1] * nums[i], dp_max[i-1] * nums[i]), nums[i]);
dp_max[i] = Math.max(Math.max(dp_min[i-1] * nums[i], dp_max[i-1] * nums[i]), nums[i]);
max = Math.max(max, dp_max[i]);
}
return max;
}
}