1. 两数之和

1. 两数之和

题目链接(简单)

题目描述

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

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

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

数据范围:

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只会存在一个有效答案

示例

示例 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]

方法一:哈希表

思路及解法

对于每个元素 nums[i],我们需要查找是否存在另一个数 nums[j] 使得 nums[i] + nums[j] == target,即 target - nums[i]。

用哈希表一遍扫描:遍历时先查 target - num 是否已经在表中(在则直接得到答案),不在则记录 num → 下标。每个数只处理一次,时间复杂度 $O(n)$。

具体步骤:

  1. 使用哈希表存储已遍历过的元素及其下标;
  2. 遍历数组,对每个元素 num,检查 target - num 是否在哈希表中;
  3. 如果存在,则返回对应下标和当前下标;
  4. 否则将当前元素及其下标存入哈希表。

若数组已有序,可改用对撞指针(两端向中间收缩,$O(1)$ 额外空间),模板见 04_滑动窗口 的「对撞指针」一节。

代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        d = dict()
        for i, num in enumerate(nums):
            if target - num in d:
                return [d[target - num], i]
            else:
                d[num] = i
        return []

复杂度分析

  • 时间复杂度:$O(n)$,遍历数组一次,哈希表查找为 $O(1)$。
  • 空间复杂度:$O(n)$,哈希表最坏情况下存储全部元素。

1. 两数之和
https://mingsm17518.github.io/2026/10/05/刷题笔记/Hot100/哈希/1. 两数之和/
作者
Ming
发布于
2026年10月5日
更新于
2026年10月5日
许可协议