【JavaScript】配列の中の2つの数と指定された値のすべての整数ペアを検索します.


筆記試験の時、ちょうどこの問題を達成しました.整体配列(配列中の要素は重複して並べられています.)と指定された値を決めます.配列の中の2つの数の和が指定値のすべての整数ペアを探し出して、時間の複雑さがO(N)であることを必要とします.
     まずこの問題を分析してみます.問題は順序付けと時間の複雑さの要求がないと仮定して、最も暴力的な方法で直接に二回の配列を遍歴して、時間の複雑さはO(N*N)です.ここでも実現してみます.コードは以下の通りです.
/*   ,        ,      O(n*n)*/
function getSum(arr,sum){
    if(arr == '' || arr.length == 0){
        return false;
    }

    for(var i = 0; i < arr.length ; i++){
        for(var j = i + 1; j 
      テーマに順序付けが明記されていない場合は、まず型配列を並べ替え、並べ替え後に2つのポインタleftとrightを定義します.leftは、並べ替えられた配列の最初の要素を指し、rightは、並べ替えられた配列の最後の要素を指し、arr[left]+arr[right]を与えられた要素と比較し、前者が大きいなら、right--;前者が小さければ、left++;等しい場合、一対の整数の和を指定値とする要素が見つかった.この方法は並べ替えを採用しており、並べ替え時間の複雑さはO(NlogN)であり、並べ替え後の配列全体の求めと比較をスキャンする時間の複雑さはO(N)である.したがって、全体の時間複雑度はO(NlogN)であり、空間複雑度はO(1)である.
     今はテーマに並べられていることが書いてありますので、直接上の考えで実現できます.時間の複雑さはO(N)です.次に私のコードを添付します.
function getSum(arr,sum){
    if(arr == '' || arr.length == 0){
        return false;
    }

    var left = 0, right = arr.length -1;

    while(left < right){
        if(arr[left] + arr[right] > sum){
            right--;
        }
        else if(arr[left] + arr[right] < sum){
            left++;
        }
        else{
            console.log(arr[left] + " + " + arr[right] + " = " + sum); 
            left++;
            right--;
        }
    }
}