题目描述
输入一个数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。
如果有多对数字的和等于s,输出任意一对即可。
你可以认为每组输入中都至少含有一组满足条件的输出。
样例:
思路1
对于在数组中找两数之和的题目,首先想到的是用哈希表,(暴力搜索法时间复杂度为n^2,不考虑),哈希表的查询时间为 O(1),算法的时间复杂度降低到 O(N),但是需要 O(N) 的空间复杂度来存储哈希表。首先给出哈希表的解法代码
哈希表实现
class Solution(object):
def findNumbersWithSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = dict()
for i in nums:
dic[i] = target - i
if dic[i] in nums:
return [dic[i], i]
for i in nums:
if dic[i] in nums:
return [dic[i], i]
思路2
首先说明,思路2是建立在数组为有序数组的情况下的。
对于有序数组(假设为升序),就可以使用双指针了,分别指向数组的头尾,若头尾之和等于sum,则返回;若头尾之和小于sum,则让左指针右移;若头尾之和大于sum,则让右指针左移;直至找到那两个数。思路2实现代码:
代码实现
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
left = 0
right = len(nums) - 1
while left < right:
sum1 = nums[left] + nums[right]
if target == sum1:
return [nums[left], nums[right]]
elif target < sum1:
right -= 1
elif target > sum1:
left += 1
小结
这里可以对两数之和的题目做个小结,对于无序数组,可以考虑使用哈希表;杜宇有序数组,可以考虑使用双指针。