class Solution {
// 因为是乘法,如果都是正整数,那么结果只会越乘越大,但如果有了负数,最大数会变成最小,最小会变成最大,因此要同时维护最小和最大
// 当前最大可能是:当前数本身(因为可能之前有0),之前的最大乘积乘以当前(如果当前为正数),之前的最小乘积乘以当前(如果当前负数)
// 取这三种中最大的,而当前最小则是取三者中最小的
public int maxProduct(int[] nums) {
if(nums==null||nums.length==0){
return 0;
}
int[] curMax=new int[nums.length];
int[] curMin=new int[nums.length];
curMax[0]=curMin[0]=nums[0];
int max=nums[0];
for(int i=1;i<nums.length;i++){
curMin[i]=Math.min(nums[i],Math.min(curMin[i-1]*nums[i],curMax[i-1]*nums[i]));
curMax[i]=Math.max(nums[i],Math.max(curMin[i-1]*nums[i],curMax[i-1]*nums[i]));
max=Math.max(max,curMax[i]);
}
return max;
}
}