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

数学解法#

1. 符号定义#

符号释义
n数组长度
a_i索引 i 处的元素(0 \le i \lt n
T目标值 target
l左指针,初值 l = 0
r右指针,初值 r = n - 1
S当前指针元素和:S = a_{l} + a_{r}

2. 迭代公式#

\begin{cases} S = T \implies \text{返回 } [l+1,\, r+1] \\\ S \lt T \implies l \leftarrow l + 1 \\\ S \gt T \implies r \leftarrow r - 1 \end{cases}

循环约束: l \lt r



##作者:灵茶山艾府
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left = 0
        right = len(numbers) - 1
        while True:
            s = numbers[left] + numbers[right]
            if s == target:
                return [left + 1, right + 1]  # 题目要求下标从 1 开始
            if s > target:
                right -= 1
            else:
                left += 1



##个人解法
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        for k,v in enumerate(numbers):
            if target-v in numbers[k+1:]:
                return [k+1,numbers[k+1:].index(target-v)+k+2]
        return []