跳过并跳转到主要内容
BigO

两数之和

给定整数数组 nums 与目标值 target,找出数组中相加等于 target 的两个数,返回它们的下标,保证仅有一组解,不可复用同一元素,下标返回顺序不限。

LeetCode1分钟阅读
在数组 nums = [4, 2, 11, 7] 中,目标值为 9。指针 $p1$ 和 $p2$ 分别定位到数字 2(下标 1)和 7(下标 3),因 $2 + 7 = 9$,故最终返回下标组合 [1, 3]
在数组 nums = [4, 2, 11, 7] 中,目标值为 9。指针 $p1$ 和 $p2$ 分别定位到数字 2(下标 1)和 7(下标 3),因 $2 + 7 = 9$,故最终返回下标组合 [1, 3]

给定一个整数数组 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]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

双重循环枚举所有可能性。对于每个数 x,遍历剩下的元素查找是否有 target - x。效率较低。

两数之和暴力求解(Brute-force)示例
两数之和暴力解法流程图:目标值 target=19,数组为 [16, 8, 23, 4, 15]。展示逐个元素组合相加的过程,最终选中 4+15=19,并输出下标 [3, 4]。

遍历数组时,我们需要知道“之前是否见过满足条件的另一个数”。利用哈希映射(Map)建立 数值 -> 数组下标 的映射关系:

  1. 遍历当前数字 nums[i]。
  2. 计算目标补数 complement = target - nums[i]。
  3. 检查哈希表中是否存在 complement:
    • 存在: 说明找到了匹配对,直接返回 [哈希表记录的下标, i]。
    • 不存在: 将当前的 nums[i] 及对应下标 i 存入哈希表,继续遍历。

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 哈希表:用于存储【数值 -> 数组下标】的映射
// 这样可以将查找补数的时间复杂度降为 O(1)
unordered_map<int, int> hashtable;
// 遍历数组中的每一个元素
for (int i = 0; i < nums.size(); ++i) {
// 计算当前数字所需的补数 (target - 当前值)
int complement = target - nums[i];
// 在哈希表中查找是否已经存在这个补数
auto it = hashtable.find(complement);
// 如果找到了匹配的补数
if (it != hashtable.end()) {
// it->second 是之前存入的补数的下标,i 是当前元素的下标
return {it->second, i};
}
// 如果没找到,将当前【数值 : 下标】存入哈希表,供后续元素查找
hashtable[nums[i]] = i;
}
// 如果遍历结束仍没有找到符合条件的解(按题目逻辑通常不会执行到这里)
return {};
}
};

  • 时间复杂度: O(n)O(n),只需遍历一次数组,哈希表插入与查找的时间复杂度为 O(1)O(1)。
  • 空间复杂度: O(n)O(n),哈希表最多需要存储 n−1n - 1 个元素。

© 2026 三七开 · 一方通行,只管向前。

旅途由 Astro 驱动 · 主题 Chirping Astro