LeetCode 热题 100 | 1. 两数之和

题目描述

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

限制条件: * 每种输入只会对应一个答案。 * 不能使用两次相同的元素。


解题思路:哈希表法 (Hash Table)

为了将时间复杂度从暴力法的阶级降低,我们引入哈希表(C++ 中的 std::unordered_map)作为辅助。

核心思想

我们在遍历数组的同时,计算当前数字所需的“补数”。

temp = target − nums[i]

  1. 查记忆:在哈希表中查找是否存过这个 temp。
  2. 做决策
    • 如果找到了,说明找到了目标组合,直接返回。
    • 如果没找到,将当前的数字存入哈希表,供后续数字查找。

代码实现 (C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <vector>
#include <unordered_map>

using namespace std;

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// key: 数值, value: 对应的数组下标
unordered_map<int, int> hashtable;

for (int i = 0; i < nums.size(); ++i) {
// 计算当前数字所需的补数
int temp = target - nums[i];

// 在哈希表中查找是否存在这个补数
auto it = hashtable.find(temp);

if (it != hashtable.end()) {
// 找到即返回:{补数下标, 当前下标}
return {it->second, i};
}

// 存入当前数值及其索引
hashtable[nums[i]] = i;
}

return {};
}
};

复杂度分析

时间复杂度

T(n) = O(n)

由于哈希表的查询和插入操作平均只需常数时间,我们只需遍历一次数组。

空间复杂度

S(n) = O(n)

最坏情况下需要将数组中的 n 个元素全部存入哈希表。


总结

在 C++ 中处理这类“寻找特定配对”的问题时,使用 std::unordered_map 是典型的空间换时间策略。

关键点提醒:

  • 为什么是 O(n) 因为哈希表将搜索的时间从 O(n) 降到了 O(1)。
  • 避免自匹配:代码逻辑是“先查找,后存入”,这确保了 nums[i] 不会和它自己匹配。

LeetCode 热题 100 | 1. 两数之和
http://example.com/2025/12/30/LeetCode热题100-1两数之和/
Author
Jokerlove
Posted on
December 30, 2025
Licensed under