1. 程式人生 > >【JS】兩數之和 II - 輸入有序陣列 #陣列 #雙指標 #二分查詢

【JS】兩數之和 II - 輸入有序陣列 #陣列 #雙指標 #二分查詢

給定一個已按照升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。

說明:
返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。

示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。

解法一:

兩次遍歷,暴力計算。使用第1個數與後面的每個數之和判斷是否等於目標值、再用第2個數字做同樣的操作,直到完全相等,返回索引值+1

// 2018/11/18 Sun 下午
var twoSum = function(numbers, target) {
    var len=numbers.length
    for(var i=0;i<len;i++){
        for(var x=i+1;x<len;x++){
            if(target-numbers[i]==numbers[x]){
                return [i+1,x+1]
            }
        }
    }
};

17 / 17 個通過測試用例
執行用時:264 ms

解法二:

使用兩層迴圈,第1層順序遍歷,第2層二分查詢。
第一個數是順序取的,第二個數mid是從陣列中間取的,當兩數相加大於目標值,那麼mid賦值給右邊,當兩數相加小於目標值,那麼mid賦值給左邊

// 2018/11/18 Sun 下午
var twoSum = function(numbers, target) {
    var len=numbers.length-1
    for(var i=0;i<=len;i++){
        var low=i+1,hig=len,mid
        while(low<=hig){
            mid=Math.ceil((low+hig)/2)
            if(numbers[i]+numbers[mid]==target){
                return [i+1,mid+1]
            }
            if(numbers[i]+numbers[mid]>target){
                hig=mid-1
            }else{
                low=mid+1
            }
        }
    }
};

17 / 17 個通過測試用例
執行用時:72 ms