给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
dp,max[i]代表以i为结尾的最大字串乘积和,min[i]代表以i为结尾的最小字串乘积和。
之所以还要保存最小乘积和,是因为元素有可能是负的,最小值乘上一个负数就变成了最大值,然后就可以保证一直更新下去。
max[i]和min[i]的初始值都是nums[i],因为max[i]有可能是从max[i-1]更新过来的,也可能不从max[i-1]更新过来,比如{0,2},max[1]很明显为2。
class Solution {
public int maxProduct(int[] nums) {
int len = nums.length;
int min[] = new int [len];
int max[] = new int [len];
for(int i=0;i<len;i++)
{
max[i] = nums[i];
min[i] = nums[i];
}
for(int i=1;i<len;i++)
{
if(nums[i]<0)
{
min[i] = Math.min(max[i-1]*nums[i],min[i]);
max[i] = Math.max(min[i-1]*nums[i],max[i]);
}
else
{
min[i] = Math.min(min[i-1]*nums[i],min[i]);
max[i] = Math.max(max[i-1]*nums[i],max[i]);
}
}
int ans = -0x3f3f3f3f;
for(int i=0;i<len;i++)
ans = Math.max(ans,max[i]);
return ans;
}
}