一、题目回顾
给定整数数组 nums 和目标值 target,找出数组中相加等于 target 的两个数字,返回二者下标。
- 输入保证唯一解;同一个元素不能使用两次;下标返回顺序不限。
二.解法
思想:空间换时间
暴力双层循环时间复杂度 \(O(n^2)\),大数据场景效率低下。 我们借助**哈希表unordered_map**将查询操作平均时间降到 \(O(1)\),整体时间复杂度优化至 \(O(n)\)。
哈希表存储映射关系:数组元素值 → 元素下标 遍历流程:
- 设当前遍历元素
nums[i],计算互补值k = target - nums[i]; - 查询哈希表中是否存在互补值
k;- 存在:直接返回
{哈希表中k对应的下标, 当前下标i}; - 不存在:把当前
nums[i]和下标插入哈希表,留给后续元素匹配。
- 存在:直接返回
⚠️ 关键顺序:先查询,后插入 如果先插入再查询,会读取刚存入的当前元素,造成同一个元素重复使用,违反题目要求。
cpp
#include<unordered_map>
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n=nums.size();
unordered_map<int,int> hash(n);
for(int i=0;i<n;i++)
{
int k=target-nums[i];
if(hash.count(k)>0)
{
return {hash[k],i};
}
hash.insert({nums[i],i});
}
return {-1,-1};
}
};