代码随想录刷题-哈希表-两数之和
创始人
2025-06-01 09:56:06

文章目录

    • 两数之和
      • 习题
      • 暴力解法
      • 哈希表

两数之和

本节对应代码随想录中:代码随想录,讲解视频:梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili

习题

题目链接:1. 两数之和 - 力扣(LeetCode)

给定一个整数数组 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]

暴力解法

作为 LeetCode 的第一题,题意很明确,就是数组中找和为 target 的两个数,返回他们的下标,并且一定能找到这俩数,并且答案唯一(顺序可以不一样)。

最直接的就是两个 for 循环遍历一个数的时候看看剩余的数里面有没有满足和为 target 的

class Solution {public:vector twoSum(vector& nums, int target) {int size = nums.size();vector res;for (int i = 0; i < size; i++) {for (int j = i + 1; j < size; j++) {if (nums[i] + nums[j] == target) {res.push_back(i);res.push_back(j);return res;}}}return res;}
};
  • 时间复杂度:O(n^2)。有两个循环,每个循环运行 n 次,所以总的运行次数为 n * n = n^2
  • 空间复杂度:O(n)。创建了长度为 n 的向量 res 来存储结果

可以优化的点

  • 其实不用新定义个 res,在返回的时候直接返回 return {i,j} 即可,这样空间复杂度就优化成 O(1)

哈希表

上面的暴力解法,就是先遍历一个数,然后再查找剩余的数中有没有 target-nums[i]。那就简化成了在数组中查找一个元素是否存在的问题,所以就可以使用哈希表,因为哈希表查找元素的时间复杂度为 O(1)。

而哈希表有3种:数组、set 和 map,只有 set 和 map 是有 O(1)的 find 函数的。但是 set 只存储 key,而题目要求返回的是下标,set 无法直接得到原来的数的下标。

STL 中有个 distance 函数可以计算两个元素之间的距离,计算找到的元素和 set.begin()之间的距离就可以获得下标吗?
答:这种方法无法获得原有的下标,使用 unordered_set 插入元素时不会保留原始顺序,而是根据哈希表中元素的内部顺序随机排序。也就是说,即使向 set 中添加与 vector 中相同的元素,它们在 set 中的顺序也可能与在 v1中的顺序不同。例如示例中的{2,7,11,15}在 unordered_set 中就会变成{11,7,15,2}的顺序

map 中只有 unordered_map 的查询效率为 O(1),那么 key 和 value 存什么呢?map 查找的时候查的是 key,而我们要找的是 target-nums[i]即查的是元素本身。那么 key 存的就是数组中的元素,而 value 存的就是对应的下标

我的写法如下

class Solution {public:vector twoSum(vector& nums, int target) {// 创建一个无序哈希表map,key为整数型,value为整数型unordered_map map;// 遍历nums中的元素,将元素值作为键,元素下标作为值插入到map中for (int i = 0; i < nums.size(); i++) {map.insert({nums[i], i});}for (int i = 0; i < nums.size(); i++) {int tmp = target - nums[i];// 判断map中是否含有该差值,如果存在且满足条件则返回下标值if (map.find(tmp) != map.end()) {if (i != map[tmp]) {return {i, map[tmp]};}}}return {};}
};
  • 时间复杂度:O(n)。其中,第一个 for 循环遍历整个 nums 数组,需要 n 次操作;第二个 for 循环也遍历整个 nums 数组,需要 n 次操作,哈希表map插入n个元素,需要n次操作。因此总的时间复杂度为O(n+n+n)=O(n)
  • 空间复杂度:O(n)。创建了一个哈希表,存储了n个元素,因此空间复杂度为O(n)

而看过题解后,上面的写法可以有优化的地方。我是先将所有元素插入到 map 中,而实际上没有必要先插入所有元素。只需要当没有 target - nums[i]的时候再将当前 nums[i]插入到 map 中,这样也避免了和自己匹配即2*nums[i]=target。如2,7,11,15,target=9,当 i=0时,虽然没有找到 map 中含有7。但是将2插入 map 后,当 i=1即去找 map 中是否含有2的时候就可以找到了。

class Solution {public:vector twoSum(vector& nums, int target) {unordered_map map;for (int i = 0; i < nums.size(); ++i) {auto it = map.find(target - nums[i]);if (it != map.end()) {// 如果找到了,返回这两个元素的下标return {it->second, i};}// 否则将当前的数插入哈希表map[nums[i]] = i;}return {};}
};
  • 时间复杂度:O(n)。其中n是nums数组中元素的个数,因为只需要遍历一次nums数组就能找到符合条件的目标值两个元素
  • 空间复杂度:O(n)。在最坏情况下,所有的元素都需要插入哈希表中,所以哈希表的空间占用和nums数组大小相同

相关内容

热门资讯

樟树有什么作用,樟树有什么作用... 樟树有什么作用目录樟树有什么作用樟树有什么作用?樟树的用途有哪些?樟树有什么作用?樟树有什么作用 ...
dazl启动子的作用,启动子和... dazl启动子的作用目录dazl启动子的作用启动子和终止子是什么作用的?dazl启动子的作用启动子的...
写字楼是干什么的 极速百科网 ... 写字楼是干什么的目录写字楼是干什么的写字楼是干什么的写字楼是干什么的 写字楼的功能介绍写字楼是干什么...
骄傲的两种解释,骄傲的意思是什... 骄傲的两种解释目录骄傲的两种解释骄傲的意思是什么?骄傲的两种解释骄傲的两种解释 “骄傲”有两个...
jp是哪个国家的缩写(jp是哪... 本篇文章极速百科给大家谈谈jp是哪个国家的缩写,以及jp是哪个国家的缩写名字对应的知识点,希望对各位...
苹果手机显示不支持此配件怎么办... 不支持此配件怎么解决 苹果iphone可能不支持此配件怎么办怎么解除不支持此配件 不支持此配件怎么解...
支付宝借呗的利息是多少,蚂蚁借... 支付宝借呗的利息是多少目录支付宝借呗的利息是多少蚂蚁借呗利息是怎么计算的蚂蚁借呗的利息是多少借呗的利...
关于兰字的词语或成语越多越好.... 关于兰字的词语或成语越多越好.目录关于兰字的词语或成语越多越好.有关兰字的成语有哪些关于兰的词语或成...
宝马m5多少钱是不是很贵呢?(... 本篇文章极速百科给大家谈谈宝马m5多少钱是不是很贵呢?,以及宝马m5li多少钱对应的知识点,希望对各...
辽宁省喀左县在哪个城市,辽宁省... 辽宁省喀左县在哪个城市目录辽宁省喀左县在哪个城市辽宁省朝阳市喀左县的邮政编码辽宁省喀左县在哪里辽宁省...
关于marcjacobs香水,... 关于marcjacobs香水目录关于marcjacobs香水marcjacobs香水(探索时尚与艺术...
四级英语考试时间分配,大学英语... 四级英语考试时间分配目录四级英语考试时间分配大学英语四级考多长时间?英语四级考试时间安排?英语四级考...
dnfbuff强化有什么用,地... dnfbuff强化有什么用目录dnfbuff强化有什么用地下城buff强化栏DNF中人物的Buff有...
幼儿园孩子新年祝福语简短,适合... 幼儿园孩子新年祝福语简短目录幼儿园孩子新年祝福语简短适合幼儿园小朋友说的新年祝福语幼儿园老师给小朋友...
正断层有哪些断层组合类型,断层... 正断层有哪些断层组合类型目录正断层有哪些断层组合类型断层的组合类型简答题 断层的类型及组合形式有哪些...
腿皮肤干燥起皮怎么办,腿上起干... 腿皮肤干燥起皮怎么办目录腿皮肤干燥起皮怎么办腿上起干皮怎么办腿干燥脱皮怎么办?腿上皮肤干燥起皮怎么办...
怎么用qq号注册微信,如何用q... 怎么用qq号注册微信目录怎么用qq号注册微信如何用qq号注册微信号呢?微信用qq号怎么注册?怎么用q...
招聘技巧和方法有哪些,招聘途径... 招聘技巧和方法有哪些目录招聘技巧和方法有哪些招聘途径和方法有哪些最有效的招聘方法有哪些?招聘的渠道和...
美团怎么评价,美团外卖怎么给好... 美团怎么评价目录美团怎么评价美团外卖怎么给好评?美团30字通用好评语有哪些?美团怎么评价商家的菜品呢...
龙虾片可以用空气炸锅吗,空气炸... 龙虾片可以用空气炸锅吗目录龙虾片可以用空气炸锅吗空气炸锅龙虾片用空气炸锅炸虾片的做法分享空气炸锅能炸...
小楼是什么烟(小楼多少钱一条)... 本篇文章极速百科给大家谈谈小楼是什么烟,以及小楼多少钱一条对应的知识点,希望对各位有所帮助,不要忘了...
电动汽车的品牌有那些?(电动汽... 本篇文章极速百科给大家谈谈电动汽车的品牌有那些?,以及电动汽车的品牌有哪些?对应的知识点,希望对各位...
全开麦和半开麦区别是什么,半开... 全开麦和半开麦区别是什么目录全开麦和半开麦区别是什么半开麦和全开麦的区别一般韩国音乐节目中歌手用的麦...
转机的流程是什么,飞机中转需要... 转机的流程是什么目录转机的流程是什么飞机中转需要什么流程坐飞机中转机需要注意什么,怎么转?飞机中转需...
什么的田野填空三字词语,什么的... 什么的田野填空三字词语目录什么的田野填空三字词语什么的田野 什么的田野如何组词恰当的词语()的田野什...
wps排序怎么操作步骤,wps... wps排序怎么操作步骤目录wps排序怎么操作步骤wps怎么排序wps表格可以设置排序么?wps怎么自...
中秋节思念家人的诗句,八月十五... 中秋节思念家人的诗句目录中秋节思念家人的诗句八月十五思念亲人的诗词中秋节思念亲人的诗句。中秋节思念家...
新买的苹果手机怎么激活,苹果手... 4. 同意条款和条件:在屏幕上出现的界面中,滑动屏幕并同意苹果的条款和条件。 5. 选择语言和...
烯丙基取代和加成的条件 极速百... 烯丙基取代和加成的条件目录烯丙基取代和加成的条件烯丙基取代和加成的条件
薛平贵与王宝钏结局,薛平贵与王... 薛平贵与王宝钏结局目录薛平贵与王宝钏结局薛平贵与王宝钏大结局????薛平贵与王宝钏结局 薛平贵...