![2acc512f193697fb6d5f8af7cd1639aa.gif](https://i-blog.csdnimg.cn/blog_migrate/9b3ef601039809a4840c2c1bff6915d1.gif)
❝哈希法中只用数组和set还是不够的!
❞
第1题. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
「示例:」
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路
很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
使用哈希法最为合适,之前已经介绍过,数组和set在哈希法中的应用,那么来看一下使用数组和set来做哈希法的局限。
- 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
- set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为要返回x 和 y的下表。所以set 也不能用。
此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下表。
C++中map,有三种类型:
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。
同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看关于哈希表,你该了解这些!。
「这道题目中并不需要key有序,选择std::unordered_map 效率更高!」
C++代码
class Solution {
public:
vector twoSum(vector& nums, int target) {
std::unordered_map map;for(int i = 0; i auto iter = map.find(target - nums[i]);if(iter != map.end()) {return {iter->second, i};
}
map.insert(nums[i], i);
}return {};
}
};
欢迎在评论区留言讨论!
我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图看一看一定会有所收获!
-------end------- 因为公众号改版,时间线被打乱,一些精彩文章大家可能错过了。如果感觉这里的文章对你有帮助, 赶紧给「代码随想录」加一个星标吧,方便第一时间阅读文章。 往期 精彩回顾哈希表:今天你快乐了么?哈希表:哈希值太大了,还是得用set哈希表:可以拿数组当哈希表来用,但哈希值不要太大! 「代码随想录」期待你的关注!每天一道经典算法题目,助你轻松学习算法!
![a3583e9091967f5b10a33053fe1b60b6.png](https://i-blog.csdnimg.cn/blog_migrate/f845831bc32f8c19ed5e0ed417fc807d.png)
![b8dc3613359a64256129b1847235270a.gif](https://i-blog.csdnimg.cn/blog_migrate/5468e533656821ec2e76070f13724abe.gif)