LeetCode 167. 兩數之和 II - 輸入有序數組【玩轉雙指針】

題目描述

在一個增序的整數數組裏找到兩個數,使它們的和爲給定值。已知有且只有一對解。

解題思路

  • 因爲數組已經排好序,我們可以採用方向相反的雙指針來尋找這兩個數字,一個初始指向最 小的元素,即數組最左邊,向右遍歷;一個初始指向最大的元素,即數組最右邊,向左遍歷。 如果兩個指針指向元素的和等於給定值,那麼它們就是我們要的結果。
  • 如果兩個指針指向元 素的和小於給定值,我們把左邊的指針右移一位,使得當前的和增加一點。如果兩個指針指向元 素的和大於給定值,我們把右邊的指針左移一位,使得當前的和減少一點。
  • 可以證明,對於排好序且有解的數組,雙指針一定能遍歷到最優解。證明方法如下:假設最 優解的兩個數的位置分別是 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};
    }
};
學如逆水行舟,不進則退
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章