Day6 哈希表1

作业条:

242. 有效的字母异位词

题目链接:
https://leetcode.cn/problems/valid-anagram/

文章讲解
https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html#%E6%80%9D%E8%B7%AF

视频讲解

第一想法

创建一个26个单位的数组表示每个字母出现的频次,然后分别统计两个单词字母出现的频率,如果不相同则直接返回,如果最后数组一致则为异位词。

看完解答后的想法

相同

实现过程中的问题

349. 两个数组的交集

https://leetcode.cn/problems/intersection-of-two-arrays/

第一想法:

用第一个数组创建一个set,如果第二个数组在这个set里面出现,那么就把这个值加入到结果set;
或者开辟一个长度为1001的数组,然后如果数组1出现,就把对应值设为1;如果数组2里面也出现并且hash值为1,那么就是相交数字。

看完解答后的想法:

实现过程中的问题:

注意unordeder_set的使用方法
初始化:unordered_set set1(nums1.begin(),nums1.end());
查找:set1.find(num)!=set1.end()
插入:res.insert(num);

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

第一想法:

没看明白

看完解答后的想法:

每次计算每个位上数字的平方和,然后判断这个和有没有在set中出现,如果出现过则表示重复,不是happy数;如果是1则是happy数。

实现过程中的问题:

1.两数之和

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

文章讲解
https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E6%80%9D%E8%B7%AF

视频讲解

第一想法

用双重循环遍历数组

看完解答后的想法

用map保存数字和下标,然后用target-nums[i]直接找有没有对应的,如果没有,则加入map;如果有,则输出两个值的下标

实现过程中的问题

注意map的初始化和使用
std::unordered_map <int,int> map;
auto iter = map.find(target - nums[i]);
if(iter != map.end())
return {iter->second, i};
map.insert(pair<int, int>(nums[i], i));

今日收获和学习时长

2h