【JS】配列中の3つの数の最大積

1967 ワード

整数配列を指定して、3つの数からなる最大積を行列で見つけ、この積を出力します.
例1:入力:[1,2,3,4]出力:24注意:
例2:入力:[-1000、-1000、-1000]出力:-100000注意:
例3:入力:[-4、-3、-2、-1,60]出力:720注意:
例4:入力:[722,951,999、-879、-858,803,903、-736,726、-960、-984,937、-758、-559,903,825,368、-674,57、-959,884、-681,969、-936,878、-868、-868、86742、-868、86747、-869出力:943695360
指定された配列長範囲は[3,104]であり、配列内のすべての要素範囲は[−1000,1000]である.入力された配列の任意の3つの数の積は、32ビットの符号付き整数の範囲を超えません.
 
解法の1:負数があるので、書き始めたばかりの時に正数組の負の配列を使って受信しました.中にはたくさんの判断やデータの並べ替えがあります.コード全体が複雑に見えます.自分で見たものは全部目にかかって、書き直したほうがいいと思います.全部削除しました.元のデータを関数で並べ替えます.一番大きいのは前で、一番小さいのは後ろです.負数は二重にして使わなければならないので、最後の2つを掛け合わせて1位を掛けて得られた結果は、前の3つに乗算して得られた結果と比較されます.より大きな値を返します.(ケース:[60、-1、-2、-3、-4]は、明らかに、後の2つのビットが第1のビットに乗じて得られた結果は、前の3つのビットより大きいです.
/**
 * @param date 2018/11/11   
 */
var maximumProduct = function(nums) {
    var sum = 1,arr=nums,arr2=[],len=nums.length;
    arr.sort(sortNum)
    for(var i in arr){
        if(i<3){
            sum *=arr[i]
        }
    }
    if(len>3){
        var sum2=arr[len-2]*arr[len-1]*arr[0]
        sum=sum>sum2?sum:sum2;
    }
    return sum;   
};

//      
var sortNum = function sortNum(a,b){return b - a}
83/83個が試験用例で実行される場合:164 ms
 
解法二:第二の方法は最初に使用した方法と似ていますが、もう2つの配列を追加しません.3つの数の積ですから、6桁の配列で正数と負数の結果をそれぞれ計算できます.解法は次のようにして、まず6つの数を新たな配列に追加して、遍歴の新しい値のたびに、最大と最小の数を入れ替えてもいいかどうかを判断します.一番後ろの二つ(おそらく負の数)の数に第一を乗じて、最大3つの数を掛け合わせた結果を比較して、積がより大きい値を返します.
/**
 * @param date 2018/11/11   
 */
var maximumProduct = function(nums) {
    var sum = 1,arr=[],len=nums.length;    
    for(var i=0;iarr[2]){
                    arr[2]=nums[i];
                }
                if(nums[i]=3){
        var sum2=arr[len-2]*arr[len-1]*arr[0]
        sum=sum>sum2?sum:sum2;
    }
    return sum;   
};
//    
var sortNum = function sortNum(a,b){return b - a}
83/83個が試験用例で実行される場合:160 ms