You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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来走一遍:

  1. 第一次循环:i=0,num=2,n=9-2=7。此时h是空的,7不在里面,所以把h[2] = 0存进去。
  2. 第二次循环:i=1,num=7,n=9-7=2。检查h发现2存在,对应下标是0,所以直接返回[0,1],完全符合预期!
额外说下效率

这个方法的时间复杂度是O(n),因为每个元素只遍历一次,哈希表的查找操作是O(1);而如果用暴力双重循环(遍历每个元素,再遍历后面的元素找补数),时间复杂度是O(n²),数据量大的时候差距会非常明显。

内容的提问来源于stack exchange,提问作者harry pop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:43:11