问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
抽取条件
不能重复利用元素,意思假如target是18,数组为[9,0],你不可以返回[0,0]。
题外话
不知不觉,发现这道题之前已经做过两遍了(java、c++),这种感觉就像是你背单词,每次鼓起勇气开始背,第一个单词总是Abandon。
以后可能会不间断刷刷题了,果然,我还是想用Python3来刷题,能让我有一种刷题的快感,怎么说呢,能让我摆脱语言的束缚,虽然有点费游标卡尺,但能真正享受到算法的乐趣(既然无法反抗,那就享受吧 = =),毕竟Python3很灵活。虽然这道题是easy,但不耽误我给自己开个好头。
思路
- 最重要的,这道题必须能想到target - current,才能得到最优解。current代表当前正在遍历的元素,令target - current = exist,那么exist就是已经遍历过的元素。如果target - current是已经遍历过的,那么说明两个目标就找到了。
- 你可能想杠下,那怎么能想到上面这条思路呢:题目里说了 n u m 1 + n u m 2 = t a r g e t num1+num2 = target num1+num2=target,变换一下就是 n u m 1 = t a r g e t − n u m 2 num1 = target - num2 num1=target−num2,而且想都不用想这个数组至少得循环一遍,当你找到num2时,说明num1已经访问过了。
- 同样重要的,遍历的过程中,必须以字典形式 保存 已经遍历过的元素,key为元素,value为元素索引。
- 在做算法题时,能只循环一次,就绝不循环两次。所以,遍历过程,保存元素信息,这点很重要。
代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dictionary = dict()
for i in range(len(nums)):
current = nums[i] #当前遍历元素
if (target - current) in dictionary: #如果另一个目标元素已经遍历过
return [dictionary[target-current],i] #取出 遍历过元素的索引 和 当前元素索引,返回
else:
dictionary[ nums[i] ] = i #如果没有找到另一个目标元素,则存储 元素和它的索引
下面为最快代码,除了enumerate没啥区别:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
HashMap={}
for i,num in enumerate(nums): #使用enumerate,遍历过程中可直接使用 索引及其对应元素
if HashMap.get(target-num) is not None:
return [i,HashMap.get(target-num)]
HashMap[num]=i
return []
解法关键词
- 哈希表(字典、map)
其他
当我看见 冒号 和 -> 时,我懵了,难道Python3可以规定变量的类型了,好久没用Python3,难道Python3又改了,百度了后发现虚惊一场。
还有就是最快代码里的HashMap变量,咋一看,我还以为Python3里有一种数据结构叫HashMap呢,然后发现又是虚惊一场。