两数之和(力扣刷题)

简介: 两数之和(力扣刷题)

 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。


       你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。


       你可以按任意顺序返回答案。


       示例 1:


       输入:nums = [2,7,11,15], target = 9

       输出:[0,1]

       解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。



       示例 2:


       输入:nums = [3,2,4], target = 6

       输出:[1,2]



       示例 3:


       输入:nums = [3,3], target = 6

       输出:[0,1]


提示:


2 <= nums.length <= 104

-109 <= nums[i] <= 109

-109 <= target <= 109

只会存在一个有效答案


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/two-sum


       我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。


       那么我们就应该想到使用哈希法了。


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


       再来看一下使用数组和set来做哈希法的局限。


数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。

set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

       此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。


C++中map,有三种类型:


64a4f14c790d4339b791000afc76e340.png


std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。


       同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看关于哈希表,你该了解这些! (opens new window)。


       这道题目中并不需要key有序,选择std::unordered_map 效率更高! 使用其他语言的录友注意了解一下自己所用语言的数据结构就行。


接下来需要明确两点:


map用来做什么

map中key和value分别表示什么

       map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)


接下来是map中key和value分别表示什么。


这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。


那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。


所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。


在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。


85ba39e4b2dd4abba6485aa3d5cb68aa.png

代码如下:

class Solution 
{
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> map;
        for(int i = 0; i < nums.size(); i++)
        {
            auto iter = map.find(target - nums[i]); //自动变量
            if(iter != map.end())
            {
                return {iter->second,i};
            }
            map.insert(pair<int,int>(nums[i],i));
        }
        return {};      
}
};


相关文章
|
2天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
6 0
|
2天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
7 0
|
2天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog
15 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
2天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
22 5
|
2天前
|
存储 算法 测试技术
|
2天前
|
算法 C语言 C++
存储 算法 C语言
13 1
|
18天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
13 0
|
18天前
|
Java
刷题之Leetcode19题(超级详细)
刷题之Leetcode19题(超级详细)
13 0

热门文章

最新文章