題目描述
在一個增序的整數數組裏找到兩個數,使它們的和爲給定值。已知有且只有一對解。
解題思路
- 因爲數組已經排好序,我們可以採用方向相反的雙指針來尋找這兩個數字,一個初始指向最 小的元素,即數組最左邊,向右遍歷;一個初始指向最大的元素,即數組最右邊,向左遍歷。 如果兩個指針指向元素的和等於給定值,那麼它們就是我們要的結果。
- 如果兩個指針指向元 素的和小於給定值,我們把左邊的指針右移一位,使得當前的和增加一點。如果兩個指針指向元 素的和大於給定值,我們把右邊的指針左移一位,使得當前的和減少一點。
- 可以證明,對於排好序且有解的數組,雙指針一定能遍歷到最優解。證明方法如下:假設最 優解的兩個數的位置分別是 l 和 r。我們假設在左指針在 l 左邊的時候,右指針已經移動到了 r; 此時兩個指針指向值的和小於給定值,因此左指針會一直右移直到到達 l。同理,如果我們假設 在右指針在 r 右邊的時候,左指針已經移動到了 l;此時兩個指針指向值的和大於給定值,因此 右指針會一直左移直到到達r。所以雙指針在任何時候都不可能處於(l,r)之間,又因爲不滿足條 件時指針必須移動一個,所以最終一定會收斂在 l 和r。
AC
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int le=0,re=numbers.size()-1,sum=0;
while(le<re){
sum = numbers[le] + numbers[re];
if(sum==target) break;
else if(sum>target) --re;
else ++le;
}
return vector<int>{le+1,re+1};
}
};
學如逆水行舟,不進則退