Attention Is All You Need
阿新 • • 發佈:2021-06-13
目錄
,
因為這種方法是從兩邊往中間掃的,所以l一定不會跳過
題目
給定一個已按照升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 index1
和 index2
,其中 index1
必須小於 index2
。
說明:
返回的下標值(index1
和 index2
)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例:
輸入: numbers = [2, 7, 11, 15]
, target = 9
輸出: [1,2]
解釋: 2
與 7
之和等於目標數 9
。因此 index1 = 1
, index2 = 2
。
思路補充
我們可以用反證法證明我們這樣做不會遺漏,對於滿足條件的二元數(x,y)
因為這種方法是從兩邊往中間掃的,所以l一定不會跳過
x
r
一定不會跳過y
,剛開始時,l
,r
在左右兩端,陣列的遞增的,根據程式邏輯r
會左移直到y
停止,然後l會右移直到x
停止。
程式碼
class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int>ret; int l = 0; int r = numbers.size()-1; //和二分查詢不一樣,二分查詢中的l,r為查詢範圍的邊界,查詢 //的候選值是從l,r這個範圍中取出來的,當然邊界上的值也是 //需要我們驗證的候選值,所以二分查詢中需用<=。而這裡的 //l,r是本身要找的兩個不同的候選值下標,因為這兩個值是不同的, //所以需要用<,這裡是從兩邊向中間掃。 while(l<r) { int sum = numbers[l]+numbers[r]; if(sum == target) { ret = {l+1,r+1}; break; } else if(sum < target) l++; else r--; } return ret; } };