题目主要信息:
- 题目给出的是一个数组和一个目标值,需要我们在数组中找到两个加起来等于目标值的数组元素的下标
- 下标按升序排列,从1开始
具体思路:
我们能想到最直观的解法,可能就是两层遍历,将数组所有的二元组合枚举一遍,看看是否是和为目标值,但是这样超时了,时间复杂度过于高,我们可以考虑换一种思路。的算法是遍历两次数组,这样行不通。有没有可能遍历一次数组,同时记住之前遍历过的数组元素,只要之前遍历的数组元素等于目标值减去当前遍历的元素,即找到了这两个数。
- step 1:使用unordered_map构建一个哈希表,其中key值为遍历数组过程中出现过的值,value值为其相应的下标,因为我们最终要返回的是下标。
- step 2:遍历数组每个元素,如果目标值减去该元素的结果在哈希表中存在,说明我们先前遍历的时候它出现过,根据记录的下标,就可以得到结果。
- step 3:如果相减后的结果没有在哈希表中,说明先前遍历的元素中没有它对应的另一个值,那我们将它加入哈希表,等待后续它匹配的那个值出现即可。
- step 4:需要注意最后的结果是下标值加1.
具体可由下图所展示:
代码实现:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res;
unordered_map<int, int> hash; //创建哈希表,两元组分别表示值、下标
//在哈希表中查找target-numbers[i]
for(int i = 0; i < numbers.size(); i++){
int temp = target - numbers[i];
if(hash.find(temp) == hash.end()){ //若是没找到,将此信息计入哈希表
hash[numbers[i]] = i;
}
else{
res.push_back(hash[temp] + 1); //哈希表中记录的是之前的数字,所以该索引比当前小
res.push_back(i + 1);
break;
}
}
return res;
}
};
复杂度分析:
- 时间复杂度:,仅仅遍历数组一次,每次查询哈希表都是
- 空间复杂度:,最坏情况下找到数组结尾才找到,其他都加入哈希表,因此哈希表最长为的长度