1、两数之和

4 阅读1分钟

题号: 1

难度: 简单

专题: 哈希

created: 2026-08-20


1. 两数之和

一句话本质

找互补数,不是枚举所有数对,而是边遍历边查哈希表里有没有当前数的补数。

链接 leetcode.cn/problems/tw…

题目

给定整数数组 nums 和目标值 target,找出和为 target 的两个数的下标。假设只有唯一解,同一个元素不能用两次。

思路(从暴力到最优)

  • 暴力:两层循环枚举所有数对 (i, j),O(n²)。浪费在"我已经见过的数没记住"。
  • 优化:遍历时,把每个数的"补数"记下来——我需要 target - x,那就问哈希表:你之前存过这个值吗?存了就返回,没存就把当前数和下标登记进去。
  • 为什么是哈希表:O(1) 查找,"你有没有见过它"不需要再扫一遍数组。

关键卡点

我当时卡在这

  • 先存 dict[x] = i 再查会导致自己和自己匹配。比如 target=6, nums=[3, ...],先把 3 存进去,立刻查到 6-3=3 在 dict 里,返回两个相同下标。
  • 正确顺序:先查,后存

代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict = {}
        for i, x in enumerate(nums):
            # 先查后存
            if target - x in dict:
                # 返回对应数组下标
                return [dict[target - x], i]
            dict[x] = i

复杂度

  • 时间:O(n),一趟遍历
  • 空间:O(n),哈希表最多存 n 个元素

一句话记忆点

下次看到类似题

"两数之和 → 边遍历边查哈希表,先查后存,防自匹配。"

相似题 / 套用模板

    1. 三数之和(排序 + 双指针,因为不用返回下标)
    1. 两数之和 II(有序数组,双指针)