/*
题目:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大。
要求时间复杂度:O(n),空间复杂度:O(1)
*/
function maxProd(arr) {
var len=arr.length;
if(len<3){return;}
var prod=arr[0]*arr[1]*arr[2];
if(len===3){return prod;}
var max1=Number.MIN_VALUE,
max2=Number.MIN_VALUE,
max3=Number.MIN_VALUE;
var min1=Number.MAX_VALUE,
min2=Number.MAX_VALUE;
for(var i=0;i<len;i++){
if(arr[i]>max1){
max3=max2;
max2=max1;
max1=arr[i];
}else if(arr[i]>max2){
max3=max2;
max2=arr[i];
}else if(arr[i]>max3){
max3=arr[i];
}else{}
if(arr[i]<min1){
min2=min1;
min1=arr[i];
}else if(arr[i]<min2){
min2=arr[i];
}else{}
}
// 当数组的最大值<=0或者是数组的最小值>=0时,乘积最大就是数组中最大值的乘积
if(max1<=0||min1>=0){
return max1*max2*max3;
}
// 否则,最大乘积在(2小+1大)或(3大)中取得
var prod1=max1*max2*max3,
prod2=min1*min2*max1;
return prod1>prod2?prod1:prod2;
}
var arr=[3,-4,2,1];
console.log(maxProd(arr)); // 6