【非典型理科生勇闯蓝桥杯——第十三天】

保姆级逐行代码讲解哈希和前缀和:两数之和

今天我们来讲解一道非常经典的例题:两数之和。这道题涉及到了哈希和前缀和,是力扣的第一道题。
题目链接: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。如果查找到了,输出这两个数的下标。
此外,这种思路的一个重要前提是题目中提到 “可以按任意顺序返回答案” ,所以我们才能用查找这个数之前的数,即前缀和的思想来完成。

彩蛋

在第二个的进阶思路中,我给出的是先查询再存数,那你觉得可以先往字典中存数再查询吗?欢迎在评论区留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值