数组3个数乘积的最大值

时间:2022-12-30 15:13:37
/*
    题目:给定一个无序数组,包含正数、负数和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