Two Sum问题Python解法解析请求:代码逻辑原理疑惑解答
嘿,我来帮你把这段代码的逻辑拆解得明明白白,它其实是用哈希表(Python里的字典)来优化查找效率,比暴力双重循环高效太多啦!
我们的目标是找两个数之和等于target,并且返回它们的下标。这段代码的思路是:一边遍历数组,一边用字典记录已经见过的数字和它的下标。每遇到一个新数字,就计算出和它配对的补数(target - 当前数字),如果补数已经在字典里,说明之前已经遍历过这个补数,直接返回两个下标就行;如果没见过,就把当前数字和下标存进字典,继续往下走。
1. 初始化哈希表
h = {}
这里创建了一个空字典h,它的作用是存储已经遍历过的数字作为键,对应的下标作为值。这样我们后面查找补数的时候,能直接通过数字拿到它的位置,速度特别快。
2. 遍历数组,同时获取下标和元素
for i, num in enumerate(nums):
enumerate(nums)是Python里的实用工具,它会把数组的每个元素和它的下标配对返回。比如遍历[2,7,11,15]时,第一次会拿到i=0、num=2,第二次拿到i=1、num=7,以此类推。这样我们就能同时知道当前数字的值和它在数组里的位置。
3. 计算需要的补数
n = target - num
我们要找的是和当前num相加等于target的数,这个数就是n(也就是补数)。比如target=9,当前num=2,那补数就是7;如果当前num=7,补数就是2。
4. 检查补数是否已存在,做对应操作
if n not in h: h[num] = i else: return [h[n], i]
这是代码的核心逻辑,分两种情况:
- 如果补数
n不在字典h里:说明我们还没遇到能和当前num凑成target的数,那我们就把当前的num和它的下标i存进字典,方便后面的数字查找。 - 如果补数
n在字典h里:说明之前已经遍历过这个n,它的下标是h[n](字典里键n对应的值),当前数字的下标是i,这两个数加起来正好是target,而且因为是按顺序遍历的,h[n]肯定在i前面,不会重复使用同一个元素,直接返回这两个下标就搞定了!
拿题目里的示例nums = [2,7,11,15],target=9来走一遍:
- 第一次循环:
i=0,num=2,n=9-2=7。此时h是空的,7不在里面,所以把h[2] = 0存进去。 - 第二次循环:
i=1,num=7,n=9-7=2。检查h发现2存在,对应下标是0,所以直接返回[0,1],完全符合预期!
这个方法的时间复杂度是O(n),因为每个元素只遍历一次,哈希表的查找操作是O(1);而如果用暴力双重循环(遍历每个元素,再遍历后面的元素找补数),时间复杂度是O(n²),数据量大的时候差距会非常明显。
内容的提问来源于stack exchange,提问作者harry pop

