保姆级逐行代码讲解哈希和前缀和:两数之和
今天我们来讲解一道非常经典的例题:两数之和。这道题涉及到了哈希和前缀和,是力扣的第一道题。
题目链接:https://leetcode.cn/problems/two-sum/description/
题目描述:
样例:
1.基本思路
题目的意思很简单,在一个数组中找两个数,使两数之和等于目标值target。首先可以想到用循环来做。
第一层循环先定1个数,第二层循环遍历这个数之后的(因为题目说不能使用两次相同的元素),如果两个数加起来等于target,就输出下标。
这里有一个小点是你遍历的时候直接用下标遍历,这样结果就可以直接返回下标。
2.进阶思路
在基础思路中,我们是分别找两个数,再计算它们之和是否等于target,但是由于target是给定的,所以如果我们知道其中一个数x,就能知道另一个数是target-x。基于此,我们就有了进阶思路:把每组下标和对应的值存起来,选定一个数x,查找它前面有没有target-x。这样,我们就把求和变成了查询。
在这里,我们首先得记录每个值本身以及其下标。
如何获取一个值本身及下标呢?
涉及到值本身及其下标,我们应该想到enumerate函数,语法见上图。
那么用什么数据结构存放?
可以用字典数据结构。那么什么作键什么作值呢?由于我们查询的依据是数据的值,而最后要求的是这个数的下标,我们就可以让数据的值作键,数据的下标作值。
字典中查询的方法是get(key,default_value=None), 即查找键为key的值,找不到返回None。如果查找到了,输出这两个数的下标。
此外,这种思路的一个重要前提是题目中提到 “可以按任意顺序返回答案” ,所以我们才能用查找这个数之前的数,即前缀和的思想来完成。
彩蛋
在第二个的进阶思路中,我给出的是先查询再存数,那你觉得可以先往字典中存数再查询吗?欢迎在评论区留言讨论。