题目
和为s的数字
一、双指针
仔细观察题目,这个数组是一个递增排序数组。
例如:
假设有两个指针分别指向数组的开始和结尾,那这两个指针分别指向的是数组的最小值和最大值。
此时,如果两个指针指向的元素相加>数字s,那证明需要找一个更小的数字,此时第一个指针指向的是最小的数字,因此向左挪动第二个指针指向更小的数字。
如果两个指针指向的元素相加<数字s,那证明需要找一个更大的数字,此时第二个指针指向的是最大的数字,因此向右挪动第一个指针指向更大的数字。
直到两个指针相遇,如果还没有找到,那就证明数组中不存在两个数的和为s
时间复杂度:最坏的情况需要两个指针一起走完整个数组,O(n)
空间复杂度:只需要两个指针占用额外的空间,O(1)
def find_nums_with_sum_s_1(arr,s):
if not arr:
return []
l,p = 0, len(arr)-1
while l < p:
if arr[l] + arr[p] > s:
p -= 1
elif arr[l] + arr[p] < s:
l += 1
else:
return [arr[l], arr[p]]
return []