242 有效的字母异位词
C
- 如果使用C来写。我需要使用俩个26长的数组,遍历俩个词,存储对应字母的数量,最后比较俩个数组的每一位是否相等。
还是使用C++吧。
C++
在网站题解里,也是使用上面的想法,不过他只需要使用一个数组,遍历第二个数组的时候减去数值即可。更优化。
一次实现。
349 俩个数组的交集
如果使用数组,那么需要至少1000长。
那么这里会使用std::unordered_set。底层使用hashtable实现,不支持[]访问符,无序,不重复。访问元素O(1),冲突严重时退化成O(n)。
先遍历第一个数组,将所有元素放入unordered_set中,再遍历第二个数组,使用容器提供的find()方法,确定是否存在,存在就存入另一个vector中
原来在c++中支持使用vector容器直接初始化unordered_set,而且最后还需要先放入set中再放入vector中实现去重
一次实现
202 快乐数
可以使用双指针检测循环,移动方法就是计算俩次平方和
1. 俩数之和
首先我再强调一下 什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
那我可以使用这个数组构建一个使用数组的数值作为key,数组的下表作为值的value。接着再遍历数组,寻找targer-cur这个数值是否存在,存在就返回,否则就跳过
原来不需要先创建这个map,而是边遍历边创建,没有查到就添加。这个数组中如果存在这样的一对,那么在这一前一后肯定会被找到
unordered_map的find()返回值类型是该容器的iterator类型,是LegacyForwardIterator类型的迭代器,这种类型迭代器使用*解引用会得到该种容器的value_type类型,unordered_map容器的value_type类型是 std::pair<const Key, T>,可以使用first和second方法访问第一和第二个元素
思考题
本题其实有四个重点(1. 俩数之和):
为什么会想到用哈希表
哈希表为什么用map
本题map是用来存什么的
map中的key和value用来存什么的
把这四点想清楚了,本题才算是理解透彻了。
很多录友把这道题目 通过了,但都没想清楚map是用来做什么的,以至于对代码的理解其实是 一知半解的。
- 之所以使用哈希表,因为i这里有需要检查某个数是否存在的需求
- 使用map是我需要同时获得值和下标的对应关系
- 数组的之是key,下标是value