【JavaScript】找出數組中兩數之和爲指定值的所有整數對

      筆試的時候剛好做到這道題:定一個整型數組(數組中的元素可重複,已排序),以及一個指定的值。找出數組中兩數之和爲指定值的所有整數對,要求時間複雜度爲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 <arr.length; j++){
            if(arr[i] + arr[j] == sum){
                console.log(arr[i] + " + " + arr[j] + " = " + sum); 
            }
        }
    }

}
      如果題目沒有寫明已排序,那麼可以先將整型數組排序,排序之後定義兩個指針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--;
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章