题目的搬运者
给定一个索引为1的整数数组,这些整数已经按非递减顺序排序,找到两个数字,使它们加起来是一个特定的目标数字。设这两个数字分别为numbers[index1]和numbers[index2],其中1 <= index1 < index2 <= numbers.length。
返回两个数字index1和index2的索引,加上1作为长度为2的整数数组[index1, index2]。
生成的测试只有一个解决方案。同一元素不能使用两次。
您的解决方案必须只使用恒定的额外空间。
方案一 两次遍历 O(n^2)
这个方法是未通过的
因为想法太过普通,但没什么特别想法就还是尝试写 然后跑用例,结果就是失败了。原因肯定是因为超时了,超时那个用例是 前一大部分是0 ,后一大部分是9,最后target是5,按这个方法肯定超时。因为时间复杂度是O(n^2),所以限制条件也非常重要。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
n = len(numbers)
for i in range(n):
pos = i +1
while pos < n :
if numbers[i]+numbers[pos] == target :
return [i+1,pos+1]
pos+=1
return [-1,-1]
方案二 双指针 O(N)
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
n = len(numbers)
high = n-1
left = 0
while left <high:
sum = numbers[left]+numbers[high]
if sum==target: return [left+1,high+1]
if sum <target: left +=1
else :high -=1
return [-1,-1]
该方法与上面这个方法不同的就是,双指针的位置一个在前,一个在后。
- 两个指针同时相加时,等于target 就结束,不等于再进行判断。
- 当sum <target 时,左指针向右移动
- 当sum >target 时,右指针向左移动
因为该数组已经是排好序的,并且正确答案只有一对,所以不用担心会错过正确答案。