1. 程式人生 > 其它 >Attention Is All You Need

Attention Is All You Need

目錄

題目

給定一個已按照升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。

函式應該返回這兩個下標值 index1index2,其中 index1 必須小於 index2

說明:

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

輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 27 之和等於目標數 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;
        
    }
};