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

补充避坑点

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

相关推荐
维克兜率天4 小时前
【维克】模块3总结:从一行空数据,到一个能跑的模型
python·深度学习·算法
飞Link4 小时前
定积分理论与 Python 仿真完全指南
python·算法
小静AI工程实验室4 小时前
Python 爬虫翻页为何重复、漏数据?SQLite 复现 OFFSET、复合游标与快照的 8 项检查
爬虫·python·sqlite
夜雪一千5 小时前
如何使用Python实现音频转文本(ASR语音识别)
python
闲研随记5 小时前
RL算法学习:ArgMaxRL
算法·llm·强化学习·rl
SunnyDays10115 小时前
使用 Python 将 PowerPoint 转换为视频(无需安装 Microsoft PowerPoint)
python·powerpoint·ppt 转 动画·ppt 转 mp4·ppt 转 wmv·幻灯片转动画·幻灯片转 mp4
飞Link5 小时前
零基础:离散数据积分与 Python 实现保姆级教程
python·算法
用户0332126663675 小时前
使用 Python 将 PDF 转换为 Word(转换单个与多个文件)
python
troy1285 小时前
Visual Studio Code 详细教程:从入门到高效开发
开发语言·python