哈希表解Two Sum问题

Two Sum问题:给定一个整数数组 nums 和一个目标值 target,要求返回和为 target 的两个数的下标。
直接枚举的时间复杂度较高,主要由于每次查找 target - x 都需要线性扫描数组,导致整体复杂度达到 O(N²)。使用哈希表可以将查找操作的时间复杂度降为 O(1),从而将整体复杂度优化至 O(N)。

问题

复制代码
给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

可以假设每种输入只会对应一个答案,并且不能使用两次相同的元素。

可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

解法

建立一个哈希表,用于存储数组元素及其索引。遍历数组时,检查哈希表中是否存在 target - current_value 的键。若存在,直接返回当前索引和哈希表中存储的索引。若不存在,将当前元素及其索引存入哈希表。

python 复制代码
from typing import List

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict()                       # 哈希表:数值 → 下标
        for i, num in enumerate(nums):
            if target - num in hashtable:        # 发现配对成功
                return [hashtable[target - num], i]
            hashtable[num] = i                   # 保存当前数值的下标
        return []                                # 无解(LeetCode 保证有解,可省略)
作用
hashtable = dict() 建一个空字典,用来记录"已经扫描过的数值"及其"第一次出现的下标"。
for i, num in enumerate(nums): 一次遍历,同时拿到下标 i 和元素值 num
if target - num in hashtable: 计算"另一半"target - num,如果它已经在字典里,说明之前某个位置 j 满足 nums[j] + nums[i] == target
return [hashtable[target - num], i] 直接返回这对下标:先存进来的那个(j)和当前这个(i)。
hashtable[num] = i 如果还没找到配对,就把当前数值和下标存进字典,供后面查找。
return [] 如果遍历结束都没找到,返回空列表(LeetCode 官方数据保证有解,这句其实跑不到)。

这种方法避免了双重循环,显著提升了效率。哈希表的快速查找特性确保了每次查询操作仅需常数时间,同时只需遍历数组一次即可完成。

算法复杂度

  • 时间:O(n) ------ 只扫一次数组,字典查询/插入平均 O(1)。
  • 空间:O(n) ------ 最坏情况下字典要存 n-1 个元素。\

例子

复制代码
nums = [2, 7, 11, 15], target = 9
i=0, num=2  -> 另一半 7 不在字典 -> 存入 {2:0}
i=1, num=7  -> 另一半 2 在字典   -> 返回 [0, 1]
相关推荐
:-)9 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
yaoxin52112311 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
中微极客11 小时前
解锁LLM开发全栈能力:Python + LangChain + RAG 工程实战指南
人工智能·python·langchain
hhzz11 小时前
Barbershop:基于GAN和分割Mask的图像合成技术——从理论到实战全解析
图像处理·人工智能·python·深度学习·计算机视觉
Ulyanov13 小时前
雷达导引头Python仿真框架:GPU加速、6-DOF模型与半实物仿真接口
开发语言·python·雷达信号处理·雷达导引头
Jerry13 小时前
LeetCode 101. 对称二叉树
算法
列逍13 小时前
博客系统测试
自动化测试·python·性能测试
星云开发14 小时前
拒绝无效加班!用Python打造自动化办公流,附Word/PDF互转硬核代码
python
可编程芯片开发14 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星14 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学