【题目】
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
【举例】
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
【题目翻译】
给定一个数组和一个target, 在数组里找和为target的两个数, 返回它们的下标。
【解题思路】
这道题是我电话面试中的一道题, 我思考了一下然后回答用双指针的方法:
先把数组排序, 然后lo, hi, 分别指向数组的头部和尾部, 循环判断:
如果nums[lo]+nums[hi] == target 返回结果[lo, hi]
nums[lo]+nums[hi]>target, 最大的数被排除, hi -= 1
如果nums[lo]+nums[hi]<target, 最小的数被排除, lo+=1
说完之后感觉良好, 结果面试官说如果数组很大, 怎么办?在排序上的时间花费太多, 请想办法再O(n)的复杂度内解决。
我有些为难, 然后她提醒说, 用hash表这个数据结构来解决,
hash表?hash表是啥? 然后我就如实说了不太了解这个数据结构, 她安慰我没关系。
面试结束以后我搜了一下hash表是啥,, 原来是pytho里面的字典。。。哭
下面来介绍如何用字典在O(n)的时间复杂度内解决这个问题:
O(n)的时间复杂度说明, 我们遍历一遍数组就要得出结果
我们遍历数组, 把每个元素和target的差(当前元素所需的匹配元素的值)作为键, 位置作为值存在字典里。
遍历过程中如果发现当前元素的值在字典里面, 说明我们找到了匹配的值,
返回字典中该值对应的位置, 和当前元素的位置
【实现代码】
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
loc = {}
for i in range(len(nums)):
if nums[i] in loc: #找到匹配的值, 返回结果
return [loc[nums[i]], i]
else:
loc[target-nums[i]] = i #把当前元素所匹配的值作为键, 位置作为值记录下来
return []