需求:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
要求:
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
废话少说,直接上代码:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = dict()
for i, num in enumerate(nums):
if target - num in dic:
return [dic.get(target - num), i]
dic[num] = i
总结:
很短小很精悍是吧!
来来来~咱们分析一下:
首先创建空字典的目的是将给定数组中的元素在字典中以key-value的形式存储,当然了,key是元素,value是元素在数组中的下标。
然后enumerate()这个函数能将数组中的元素以(下标, 元素)的样式枚举出来,然后我们使用for循环遍历拆包,每次遍历我们都能获得数组中的元素以及它的下标。
最后我们每次循环判断目标值与遍历出来的元素之差(target - num)是否在我们创建的字典dic中,这一步判断的时间复杂度为O(1),因为在字典中查找元素时,字典先将元素hash,通过hash后的值(也称为索引)去查找匹配的索引。如果不存在,那么就将当次遍历的元素及其下标以key-value的形式存入dic;如果存在,那么很显然,此时的num和dic中存在的(target - num)就是天生一对,最后只需要返回它们的下标即可!