理论基础:哈希表就是根据key值来访问对应的数据结构。
哈希碰撞:元素个数大于哈希表的大小,多个元素映射到哈希表的同一个索引下标的位置。
解决办法:拉链法,线性 探测法
发生冲突的元素放到链表中;向下找一个空位置放冲突的元素。.
一般来说哈希表都是用来快速判断一个元素是否出现集合里。
242.有效的字母异位词
把字符映射到哈希表的索引下标上,遍历字符串s时,将s[i]-'a'所在元素加1;这样就统计出了s字符串中字符出现的次数。遍历字符串t时,字符对应的索引上的数值-1;最后检查数组元素是否都为0;
349.两个数组的交集
输出结果中的元素都是唯一的,不重复的,而且不用考虑输出结果的顺序。
for(int num:nums2){
if(nums_set.find(num)!=nums_set.end())//如果找不到会返回末尾的迭代器,所以判断迭代器是不是末尾迭代器。
{
result_set.insert(num);
}
}
202.快乐数
可能会无限循环,那么求和过程中,sum会重复出现。
如果sum重复出现了,就return false,否则一直找到sum=1为止。
把求和的过程写成一个函数,循环调用。
1.两数之和
用unordered_map
遍历数组,去map集合里查询是否有匹配的数值,并把遍历过得数放到map中。
数组元素作为key,元素下标作为value。
对map使用不熟练。
454.四数之和二
map的下标操作:他可以接受一个索引,获取与此关键字相关联的值。
先统计A、B两个数组中各个元素之和,并统计和出现的次数,放到map中。
再遍历C、D两个数组,如果0-(c+d)在map中出现的话,count次数就加上map中key对应的val值。这就是次数。
383.赎金信
哈希解法
先用长度为26的数组记录magazine里字母出现的次数,然后再遍历ransomNote字符串,比较该数组中是否包含所需的所有字母。
15.三数之和
哈希法:两层for循环确定a和b的值,再用哈希法确定0-(a+b)是否在数组里出现过。
双指针法:一层for循环,i遍历数组,left指向i+1的位置,right指向数组结尾。根据三处位置的和移动指针。
18.两数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,