比起最大子序列,区别就是乘法多了一个负负得正的特点,也就是之前不大的也可能会变的更大。所以我们维护两个dp,一个最大一个最小,如果此时的值是正数,则使用最大的数组,如果是负数,则使用最小的数组。
class Solution {
public int maxProduct(int[] nums) {
int[] maxdp=new int[nums.length];
int[] mindp=new int[nums.length];
maxdp[0]=nums[0];
mindp[0]=nums[0];
int res=nums[0];
for(int i=1;i<nums.length;i++){
if(nums[i]>=0){
mindp[i]=Math.min(nums[i],mindp[i-1]*nums[i]);
maxdp[i]=Math.max(nums[i],maxdp[i-1]*nums[i]);
res=Math.max(maxdp[i],res);
}else{
mindp[i]=Math.min(nums[i],maxdp[i-1]*nums[i]);
maxdp[i]=Math.max(nums[i],mindp[i-1]*nums[i]);
res=Math.max(maxdp[i],res);
}
}
return res;
}
}