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

双指针

对撞指针

function twoSum(numbers: number[], target: number): number[] {
  // 非递减的意思是说 numbers[n] <= numbers[n + 1]

  let left = 0
  let right = numbers.length - 1

  // 从数组开头遍历
  // 当 right 超出数组时遍历结束
  while (left <= right) {
    // 刚好相等的话返回
    if (numbers[left] + numbers[right] === target) {
      // 因为结果要求下标从 1 开始
      // 所以需要 + 1
      return [left + 1, right + 1]
    }

    // 如果结果偏大需要减少
    // 所以需要调整 right
    if (numbers[left] + numbers[right] > target) {
      right -= 1
    } else if (numbers[left] + numbers[right] < target) {
      // 如果结果偏小需要增加
      // 需要调整 left
      left += 1
    }
  }
}