1. 题目
两数之和:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
注意:只会存在一个有效答案
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
2.解法
解法一:通过list.index(target)来返回索引
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
# 遍历列表
for i in range(len(nums)):
# 计算需要找到的下一个目标数字
res = target - nums[i]
# 遍历剩下的元素,查找是否存在该数字
if res in nums[i + 1:]:
# 若存在,返回答案。这里由于是两数之和,可采用.index()方法
# 获得目标元素在nums[i+1:]这个子数组中的索引后,还需加上i+1才是该元素在nums中的索引
return [i, nums[i + 1:].index(res) + i + 1]
解法二:哈希表
class Solution(object):
def twoSum(self, nums, target):
"""
哈希表实现两数之和
思路:遍历数组,用字典记录已经遍历过的数字及其下标,每轮先找互补值,找不到再存入当前值
时间复杂度:O(n),仅遍历数组一次,字典查询操作时间O(1)
空间复杂度:O(n),最坏情况字典存储全部数组元素
:param nums: List[int] 输入的整数数组,存在唯一一组两数相加等于target
:param target: int 两数相加的目标和
:return: List[int] 返回两个相加数字对应的下标,顺序为先出现的下标、后出现的下标
"""
# 创建空字典hashmap
# key:数组中的数字,value:该数字对应的数组下标
# 作用:缓存已经遍历过的数字,实现快速查找配对数字
hashmap = {}
# enumerate遍历数组,同时获取下标idx、对应数值num
for idx, num in enumerate(nums):
# 计算互补值diff:需要找到另一个数字,满足 diff + num = target
diff = target - num
# 判断互补值diff是否存在于字典的key中(即前面遍历过的数字里有没有diff)
if diff in hashmap:
# 找到配对数字:hashmap[diff]是diff的下标,idx是当前数字下标
# 直接返回下标数组,函数结束,不再继续循环
return [hashmap[diff], idx]
# 没有找到配对,把当前数字和下标存入字典,留给后续数字匹配
hashmap[num] = idx
# 题目保证一定存在一组有效解,该行仅做兜底,正常逻辑不会走到这里
return []
3.思考&总结
1、列表的使用中list.index(target)是返回target在list中的第一个匹配的索引,如果不存在则不返回任何值。此题因为题目限制必然可以返回,然而此题中使用该语句仍存在瑕疵,即target之和由两个相同值相加得到时,所以循环遍历时仅遍历nums[i]之后的值,若target-nums[i]存在于后续索引则使用nums[i + 1:].index(res) + i + 1返回另一个值的索引(避免i和nums.index(res)返回值重复)。
2、哈希表存的是键值对,”if diff in hashmap:”语句是将diff值与hashmap的key值进行匹配,如果需要与values进行匹配的话,需要使用”if diff in hashmap.values():”语句。
3、哈希表中以key作为主键进行数据记录,key不可重复,value可以重复。