Two Sum, Sorted

https://leetcode.com/problems/two-sum-ii-input-array-is-sorted

给定一个有序数组a, 一个数 T,问数组 a 中是否存在两个数之和等于 T,如果有则返回这两个数的(下标+1)

双指针方法

在排好顺序的数组中,

  • 我们可以先求第一个数,即最小的数,和最后一个数,即最大的数他们的和,如果其和小于 target,则说明要把两个加数增大,而最后一个数已经是最大的,因此可以把第一个数增大,试试看第二个数与最后一个数的和
  • 如果第一个数和最后一个数的和大于target,则说明这两个加数至少有一个数大了,因此需要将它们缩小,而第一个数已经是最小的了,因此只能把最后面一个数换成倒数第二个数,再加和进行比较
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> result;
        int lo = 0;
        int hi = numbers.size()-1;
        while(lo < hi)
        {
            if(numbers[lo] + numbers[hi] > target)
            {
                --hi;
            }
            else if (numbers[lo] + numbers[hi] < target)
            {
                lo++;
            }
            else
            {
                result.push_back(lo+1);
                result.push_back(hi+1);
                return result;
            }
        }
        return result;
    }
};

提交结果:

Runtime: 4 ms, faster than 96.10% of C++ online submissions for Two Sum II - Input array is sorted.
Memory Usage: 8.6 MB, less than 100.00% of C++ online submissions for Two Sum II - Input array is sorted.

原文地址:https://www.cnblogs.com/qiulinzhang/p/12520832.html