模仿#和为S的连续数列#中双指针的思路。
使用左右两个指针,左指针left从数组最左侧开始,右指针right从数组最右侧开始。
计算左右两个指针所指向的值的和,若该和大于sum,则left++,若该和小于sum,则right--。
直到左右指针之和等于sum,此时找到结果;或左右指针指向同一位置,此时无结果,终止循环。

这种做法最多只用遍历一遍数组,时间复杂度为O(n),不借用辅助数组,空间复杂度为O(1)。
但是要吐槽的是,实际运行时间极慢,全部用例使用了20ms,仅打败0.3%的用户。空间复杂度也不尽人意。看了下大家做的也基本都是双指针向中间逼近的,希望有能之士能给点优化的方法及建议。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> res;
        if(array.empty()){
            return res;
        }
        int left = 0;
        int right = array.size() - 1;
        while(right != left){
            int s = array.at(left) + array.at(right);
            if(s < sum){
                left++;
            }
            else if(s > sum){
                right--;
            }
            else{
                res.push_back(array.at(left));
                res.push_back(array.at(right));
                break;
            }
        }
        return res;
    }
};