其实想要知道一个子数组的最大乘积首先要意识到其实子数组的乘积可以由前缀乘积除以某个更小前缀的乘积来得到,需要注意的是碰到0得重新记录前缀乘积为1,因为答案子数组不可能跨过0的。
public double maxProduct(double[] arr) {
if(arr==null||arr.length<=0) return 0;
//保留一个距离0最近的负数,一个距离0最近的正数
Double inMax = null;
Double min = null;
double curMulSum = 1.0;
double res = Integer.MIN_VALUE;
for(int i = 0;i<arr.length;i++){
curMulSum *=arr[i];
res = Math.max(curMulSum,res);
if(inMax!=null){
res = Math.max(res,curMulSum/inMax);
}
if(min!=null){
res = Math.max(res,curMulSum/min);
}
if(curMulSum==0){
inMax =null;
min = null;
curMulSum = 1;
}else if(curMulSum<0){
inMax = inMax==null?curMulSum:Math.max(inMax,curMulSum);
}else{
min = min==null?curMulSum:Math.min(min,curMulSum);
}
}
return res;
}