两数之和:哈希(LeetCode 热题 100)

一、问题描述

二、解题代码

解法一、暴力

python 复制代码
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if nums[i]+nums[j] == target:
                    s = [i,j]
                    return s

解法二、哈希

python 复制代码
from typing import List
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hash_dict = {}  # 空字典,格式 {数字:下标}
        for idx, num in enumerate(nums):
            need = target - num  # 算出需要配对的数字
            # 判断需要的数字,之前有没有遍历到
            if need in hash_dict:
                # hash_dict[need] = 配对数字的下标
                # idx = 当前数字的下标
                return [hash_dict[need], idx]
            # 没找到配对,把当前数字和下标存入字典
            hash_dict[num] = idx
小技巧:字典【数字:下标】

新建的字典中,把需要的数字当作下标存储,而该字典的值为原数列的下标。

例:

  • i=0, num=2,need=7,字典无 7 → 执行 hash_dict[2] = 0
  • i=1, num=7,need=2,字典存在 2 → 取出 hash_dict[2]=0,直接得到答案
为什么要存 数字:下标?
  1. 查询速度极快:字典查找是 O (1),暴力两层循环是 O (n²)
  2. 反向存储:把 "值" 作为 key,下标作为 value,通过目标差值反向定位历史下标
  3. 避免二次循环:每走一个元素只做一次减法 + 一次查表,一遍数组就能解完

三、区别:

  1. 你的暴力双层循环 固定第 i 个数字,只和 它后面所有数字 j(j>i) 配对求和,往后找。两层循环,重复计算多,效率低。

  2. 哈希字典单层循环 走到第 idx 个数字时,只去字典查 它前面所有数字(前面的已经提前存进字典里),往前找互补数。只遍历数组一次,前面的数据存在字典里快速查询,不用重复循环。


补充关键优势:为什么 "往前找" 更快?

暴力法:每一个数字都要和后面全部数字比对,总比对次数 n*(n-1)/2,数组越长越卡。哈希法:每个数字只做一次减法、一次字典查询(查询速度近似瞬间完成),全程只走一遍数组。

举同一个例子印证逻辑 nums=[2,7,11,15], target=9

  • 暴力:i=0(数字 2),依次和 j=1、j=2、j=3 相加,到 j=1 匹配成功。
  • 哈希:走到 idx=1(数字 7),往前查已存入字典的数字 2,直接匹配成功。

补充避坑点

哈希代码里先判断、再存入,就是为了保证永远只查前面的数字,绝对不会取到当前自身,完美满足题目 "不能使用两次相同元素" 的限制。

相关推荐
for_ever_love__24 分钟前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司27 分钟前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*27 分钟前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
XiaoMaqqqq1 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh1 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
念何架构之路2 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
惊讶的猫2 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
天赐范式2 小时前
天赐范式第186天:让方差开始自洽——Bulmer效应的闭式验证
python·数字生命·天赐范式·动态运行时·遗传方差·bulmer效应
泡茶喝茶写代码2 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
晒太羊的猫3 小时前
hot100动态规划刷题
算法·动态规划