题目
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 :
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
思路
两个指针start,end记录数组的头和尾的索引。
如果nums[start]+nums[end]==target,则找到了符合要求的两个数字;
如果nums[start]+nums[end]<target,由于数组是排序的,则需要让较小的数字更大一点,start+1;
如果nums[start]+nums[end]>target,由于数组是排序的,则需要让较大的数字更小一点,end-1。
代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
start = 0
end = len(nums)-1
while start != end:
if nums[start]+nums[end]==target:
return nums[start],nums[end]
elif nums[start]+nums[end]<target:
start+=1
else:
end-=1
return None
复杂度
时间复杂度 O(N):利用双指针,只遍历了一次数组
空间复杂度 O(1)