2025终极解决方案:LinkSwift网盘直链下载助手完全指南
2026/5/6 10:46:02
通过哈希表存储「已遍历元素值 → 下标」的映射,遍历数组时计算当前元素的 “补数”(目标值 - 当前值),若补数存在于哈希表中,则直接返回结果;若不存在,将当前元素存入哈希表,继续遍历。
假设输入为vector<int> nums和int target,最终返回vector<int>类型的下标数组,具体步骤如下:
C++ 中需要引入vector(存储数组)和unordered_map(哈希表)的头文件,并用using namespace std;简化代码(也可显式写std::):
cpp
运行
#include <vector> // 用于存储数组和返回结果 #include <unordered_map> // 哈希表容器 using namespace std;函数返回值为vector<int>,参数为数组引用nums和目标值target;创建空的unordered_map,键为元素值(int),值为元素下标(int):
cpp
运行
vector<int> twoSum(vector<int>& nums, int target) { // 初始化哈希表:键=元素值,值=元素下标 unordered_map<int, int> hashMap;使用for循环遍历数组,i为当前元素下标,nums[i]为当前元素值:
complement = target - nums[i](需要找到的另一个数);i;代码实现:
cpp
运行
// 遍历数组,i为下标,nums[i]为当前元素 for (int i = 0; i < nums.size(); ++i) { int complement = target - nums[i]; // 计算补数 // 检查补数是否在哈希表中(find返回迭代器,end()表示未找到) if (hashMap.find(complement) != hashMap.end()) { // 找到则返回结果:补数下标 + 当前下标 return {hashMap[complement], i}; } // 未找到则将当前元素和下标存入哈希表 hashMap[nums[i]] = i; }题目保证输入必有唯一答案,因此此处仅为满足函数语法要求,返回空数组:
cpp
运行
// 题目保证有解,此处仅兜底 return {}; }编写main函数测试示例用例,验证结果正确性:
cpp
运行
#include <iostream> // 用于输出结果 int main() { // 示例1:nums = [2,7,11,15], target = 9 vector<int> nums1 = {2, 7, 11, 15}; int target1 = 9; vector<int> res1 = twoSum(nums1, target1); cout << "示例1结果:[" << res1[0] << ", " << res1[1] << "]" << endl; // 示例2:nums = [3,2,4], target = 6 vector<int> nums2 = {3, 2, 4}; int target2 = 6; vector<int> res2 = twoSum(nums2, target2); cout << "示例2结果:[" << res2[0] << ", " << res2[1] << "]" << endl; // 示例3:nums = [3,3], target = 6 vector<int> nums3 = {3, 3}; int target3 = 6; vector<int> res3 = twoSum(nums3, target3); cout << "示例3结果:[" << res3[0] << ", " << res3[1] << "]" << endl; return 0; }| 遍历次数 | 下标 i | 当前值 nums [i] | 补数 complement | 哈希表状态(存入前) | 检查结果 | 哈希表状态(存入后) |
|---|---|---|---|---|---|---|
| 1 | 0 | 3 | 6-3=3 | 空 | 未找到补数 | {3:0} |
| 2 | 1 | 2 | 6-2=4 | {3:0} | 未找到补数 | {3:0, 2:1} |
| 3 | 2 | 4 | 6-4=2 | {3:0, 2:1} | 找到补数 2(下标 1) | 无需存入 |
最终返回[1, 2],符合示例 2 结果。
若用暴力法,步骤如下(时间复杂度 O (n²)):
i从 0 到nums.size()-1;i之后的元素,下标j从i+1到nums.size()-1;nums[i] + nums[j] == target,若满足则返回{i, j};暴力法代码:
cpp
运行
vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == target) { return {i, j}; } } } return {}; }unordered_map是哈希表,查找 / 插入平均 O (1);若用map(红黑树),时间复杂度会升至 O (logn),效率更低;vector<int>,满足 “返回数组下标” 的要求。