力扣题解:1、两数之和 (梦开始的地方)

发布于:2025-05-12 ⋅ 阅读:(24) ⋅ 点赞:(0)

力扣的第一个题可能会让大家放松警惕,但是对于刚开始刷题的小伙伴,这道题并不简单,我相信大多数小伙伴都是和我一样,先双循环暴力解题,然后超时。

而官方给出的哈希表解法,为这道题提供了一种全新的思路。然而,对于使用 C 语言的小伙伴来说,却又遇到了新的难题。C 语言标准库中并没有哈希表的内容,这意味着我们需要自己动手实现哈希表。如果选择使用线性哈希表,又会面临空间容量过大的问题,这无疑增加了解题的难度。

所以我们这题通常用C++的解法,本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。

我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适

因为我们不需要让集合的内容有序,所以本题我们使用的时unordered _map。

(如果有只用C语言的小伙伴,可以看一下C++的内容,在基础语法方面是大差不差的,可以简单了解派生、继承、封装,然后学一下STL部分的容器(vector  set map)就可以用C++进行解题了。)

具体解题思路:

  1. 使用哈希表存储元素及其下标

    • 使用一个 unordered _map(哈希表)来存储数组中的元素及其对应的下标。这样可以在常数时间内查找某个元素是否存在。

    • 哈希表的键是数组中的元素值,值是该元素的下标。

  2. 遍历数组

    • 遍历数组 ,对于每个元素nums[i] ,计算 it=target-nums[i]

    • 检查 i t 是否已经在哈希表中:

      • 如果在,说明找到了满足条件的两个元素,返回它们的下标。

      • 如果不在,将当前元素及其下标存入哈希表。

  3. 返回结果

    • 如果找到满足条件的两个元素,返回它们的下标。

    • 如果遍历结束后仍未找到满足条件的元素,返回一个空的向量。

以下是代码和解析:

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())
        {
//找到目标值后创建结果容器,两个值的下标都放入容器V
            vector<int>v;
            v.push_back(i);
//map的val是数组下标,所以放入v的是it->second
            v.push_back(it->second);
            return v;
        }
//遍历数组,放入map
        m.insert(make_pair(nums[i],i));

    }
//如果没有则返回空容器
    vector<int>emmpty;
    return emmpty;


    }
};