力扣题解:1、两数之和 (梦开始的地方)
力扣的第一个题可能会让大家放松警惕,但是对于刚开始刷题的小伙伴,这道题并不简单,我相信大多数小伙伴都是和我一样,先双循环暴力解题,然后超时。
而官方给出的哈希表解法,为这道题提供了一种全新的思路。然而,对于使用 C 语言的小伙伴来说,却又遇到了新的难题。C 语言标准库中并没有哈希表的内容,这意味着我们需要自己动手实现哈希表。如果选择使用线性哈希表,又会面临空间容量过大的问题,这无疑增加了解题的难度。
所以我们这题通常用C++的解法,本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。
我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
因为我们不需要让集合的内容有序,所以本题我们使用的时unordered _map。
(如果有只用C语言的小伙伴,可以看一下C++的内容,在基础语法方面是大差不差的,可以简单了解派生、继承、封装,然后学一下STL部分的容器(vector set map)就可以用C++进行解题了。)
具体解题思路:
-
使用哈希表存储元素及其下标:
-
使用一个 unordered _map(哈希表)来存储数组中的元素及其对应的下标。这样可以在常数时间内查找某个元素是否存在。
-
哈希表的键是数组中的元素值,值是该元素的下标。
-
-
遍历数组:
-
遍历数组 ,对于每个元素nums[i] ,计算 it=target-nums[i]
-
检查 i t 是否已经在哈希表中:
-
如果在,说明找到了满足条件的两个元素,返回它们的下标。
-
如果不在,将当前元素及其下标存入哈希表。
-
-
-
返回结果:
-
如果找到满足条件的两个元素,返回它们的下标。
-
如果遍历结束后仍未找到满足条件的元素,返回一个空的向量。
-
以下是代码和解析:
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {
//创建map容器存储遍历结果std::unordered_map<int,int>m;for(int i=0;i<nums.size();i++) {
//创建迭代器寻找目标值auto it=m.find(target-nums[i]);
/当迭代器不为end时,代表找到目标值if(it!=m.end()){
//找到目标值后创建结果容器,两个值的下标都放入容器Vvector<int>v;v.push_back(i);
//map的val是数组下标,所以放入v的是it->secondv.push_back(it->second);return v;}
//遍历数组,放入mapm.insert(make_pair(nums[i],i));}
//如果没有则返回空容器vector<int>emmpty;return emmpty;}
};