167. Two Sum II - Input array is sorted
题目描述
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
Note:
默认只有一个解, 而且同一个数不能使用两次
Example:
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.
解题思路
1.暴力解法. 从头开始遍历数组, 判断target和当前数之差是否也在数组中
2.动态规划. 因为这是一个递增有序数组, numbers[0]最小, numbers[tail]最大.
- 令i = 0, j = tail, 计算s = numbers[i] + numbers[j]
- 如果s > target, 则 j - 1(j左移). 能使s减小; 同理s < target, 则 i + 1(i右移), 使s增大. 直到遇到s == target.
代码
1.暴力解法
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
for i in range(len(numbers)):
if target - numbers[i] in numbers[i+1:]:
index = numbers[i+1:].index(target-numbers[i])+(i+1)
return [i+1, index+1]
- 动态规划
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i = 0
j = len(numbers)-1
while i != j:
s = numbers[i] + numbers[j]
if s == target:
return [i+1,j+1]
elif s > target:
j -= 1
elif s < target:
i += 1