167.两数之和 II - 输入有序数组

4/15/2021 Leetcode

# 167.两数之和 II - 输入有序数组

# 题目

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

# 思路

使用双指针,左指针指向第一个元素,右指针指向最后一个元素

  • 如果两个指针指向元素的和sum==target,那么得到要求的结果;
  • 如果sum<target,移动较小的元素,使 sumsum 变大一些。
  • 如果sum>target,移动较大的元素,使sum变小一些;

复杂度:

数组中的元素最多遍历一次,时间复杂度为 O(N)。只使用了两个额外变量,空间复杂度为 O(1)。

# 代码

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left = 0;
        int right = numbers.size()-1;
        while(left<right){
            int two_sum = numbers[left] + numbers[right];
            if (two_sum==target){
                return {left+1,right+1};
            }else if(two_sum<target){
                left++;
            }else{
                right--;
            }
        }
        return {};
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

此题中双指针往中间移动时,为何不会漏掉某种情况?一张图解释: