← Back to library
#167MediumArrayTwo PointersBinary Search AIに質問leetcode ↗

Two Sum II - Input Array Is Sorted

1-indexed かつ非減少順にソート済みの整数配列 numbers と整数 target が与えられる。和が target になる2つの数 numbers[index1]numbers[index2]1 <= index1 < index2 <= numbers.length)を見つけ、それぞれの添字(1-indexed)を [index1, index2] として返す。同じ要素を2回使うことはできない。解は必ずちょうど1つ存在する。定数空間のみで解くこと。

Example 1:

Input: numbers = [2,7,11,15], target = 9
Output: [1,2]

Example 2:

Input: numbers = [2,3,4], target = 6
Output: [1,3]

Example 3:

Input: numbers = [-1,0], target = -1
Output: [1,2]

Constraints:

  • 2numbers.length3×1042 \leq \text{numbers.length} \leq 3 \times 10^4
  • 1000numbers[i]1000-1000 \leq \text{numbers[i]} \leq 1000
  • numbers は非減少順にソート済み
  • 1000target1000-1000 \leq \text{target} \leq 1000
  • 解は必ずちょうど1つ存在する
使用した概念Hash TableTwo Pointers

アプローチ

思考
  • 逆側から攻める two pointer
  • 両端に置いたポインタで走査する
  • 仮の sum を取得
  • sum < target -> l += 1
  • sum > target -> r -= 1
  • sum == target になったら [l + 1, r + 1] を返却する
実装
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        l, r = 0, len(numbers) - 1

        while l < r:
            cur_sum = numbers[l] + numbers[r]
            if cur_sum == target:
                return [l + 1, r + 1]
            if cur_sum < target:
                l += 1
            else:
                r -= 1
        return [l + 1, r + 1]
Time Space