leetcode[01]两数之和

两数之和

image-20220126182426125

第一种方法:暴力循环,直接使用双重循环,虽然速度很慢,但先想一种题解之后再去慢慢想更优解,咱就有一个低保了!!

优解:哈希表(Hash Table)!什么是哈希表呢?简单点就是用于存储键&值对的数据结构。而C++里的map正好符合了这一特点,所以我用map进行求解。map?桥豆麻袋!这里稍微等一下,熟悉C++ STL的应该知道还有无序map即unordered_map其时间复杂度为O(1),这笔在这一题中超越了map的O(log(n)),那这不拿来耍一耍岂不是浪费!当然map与其兄弟unordered_map的用法基本一致。所以照猫画虎还能大捞一笔。废话不多说下面上题解:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<intint> hs;             //建立哈希表
        for(int i = 0; i < nums.size(); i ++) { //循环顺序是从前往后找
            int r = target -nums[i];            //r是接下来将要查询的值
            if(hs.count(r))                     //确认一下哈希表中是否可以找到键为r的元素(这里r属于键,而不是值!)
                return {hs[r], i};              //返回已经找到的 键(r)的值(hs[r]),并按输出要求与对应的值组成一起返回一个vector
            hs[nums[i]] = i;                    //若没有找到,则将当前元素做键,其下标做值,插入到hs表中
        }
        return {};  //这里废话,因为不写这句leetcode不给过
    }
};

用图示来更清晰的说明一下上述方法的思路:其核心在于从前往后找,找不到则加入哈希表hs中。

演示文稿1
posted @ 2022-01-26 21:22  仗剑天涯横刀笑  阅读(36)  评论(0)    收藏  举报