两数之和:哈希(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,直接匹配成功。

补充避坑点

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

相关推荐
泷寂13 分钟前
最小生成树 (MST基础)
算法
Daniel_12328 分钟前
数组——总结篇
算法
不懒不懒44 分钟前
【针对路面识别数据集,结合三轴加速度标准化数据及多路面识别需求,以下是算法选择与处理方案】
算法
Reart1 小时前
Leetcode 121. 买卖股票的最佳时机(717)
后端·算法
会编程的小孩1 小时前
初识数据类型以及变量定义
数据结构·算法
许彰午1 小时前
100_Python面试常见问题汇总
java·python·面试
皓悦编程记1 小时前
【YOLO26 系列】基于YOLO26的垃圾分类检测系统【python源码+Pyqt5界面/WEB+数据集+训练代码】
python·qt·分类
Reart1 小时前
Leetcode 337.打家劫舍3(717)
后端·算法
梅梅绵绵冰1 小时前
数据结构-时间复杂度
数据结构·算法
滴滴滴嘟嘟嘟.1 小时前
强化学习消融实验-batch_size / clip_range / gae_lambda / lr
python·机器学习