set作为哈希表
202.快乐数
快乐数是重复 将一个正整数的每个位置上的数字的平方和替换为它自身,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
在这个重复替换的过程中,如何判断这个数进入了无限循环呢?也就是说:进入无限循环以后,某个数会重复出现,因此,要判断是否会出现无限循环,也就是要判断在这个替换的过程中某个数 是否会重复出现,因此必要用到哈希表!
同时这道题考察了如何求出一个整数的每个位上的值!这属于C++基础-查漏补缺中的内容!
map作为哈希表
1.两数之和
题目要求:在给定一个整数数组 nums
中找到 相加等于目标值 target
的那 两个 整数,并返回它们的数组下标。
本题其实就是:查询在一个数组中是否出现了另一个与当前遍历的元素匹配的元素,如果出现了,则返回其下标。因此,这就涉及到了哈希表!
遍历,查询哈希表中是否出现过target-nums[i],若未出现,则将当前数值存放到哈希表中,由于返回的是下标值,因此将target-nums[i]作为key值,下标值作为value值,最后返回即可!
(~)454.四数相加Ⅱ
题目给定4个长度均为n的整数数组,在每个数组中各选一个元素,使得四数相加等于0。
本题的暴力解法为n^4,并非最优的。
这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况。
本题为什么会想到哈希表法呢?首先是因为A[i] + B[j] + C[k] + D[l] = 0具有一定的匹配关系,并且不需要考虑去重的问题,要在一个数组B中找到与另一个数组A有关的元素,就涉及到了哈希表。本题与有效的字母异位词或者 两个数组的交集是跟相似的,都是要寻找两个不同的字符串/数组直接具有匹配关系的元素/个数。
本题解题步骤:
- 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
- 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value,也就是出现次数统计出来。
- 最后返回统计值 count 就可以了