【JS】兩數之和 II - 輸入有序陣列 #陣列 #雙指標 #二分查詢
阿新 • • 發佈:2018-11-21
給定一個已按照升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 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