代码随想录刷题-哈希表

理论基础:哈希表就是根据key值来访问对应的数据结构。

哈希碰撞:元素个数大于哈希表的大小,多个元素映射到哈希表的同一个索引下标的位置。

代码随想录刷题-哈希表_第1张图片

 解决办法:拉链法,线性 探测法

代码随想录刷题-哈希表_第2张图片        代码随想录刷题-哈希表_第3张图片

 发生冲突的元素放到链表中;向下找一个空位置放冲突的元素。.

一般来说哈希表都是用来快速判断一个元素是否出现集合里

242.有效的字母异位词

把字符映射到哈希表的索引下标上,遍历字符串s时,将s[i]-'a'所在元素加1;这样就统计出了s字符串中字符出现的次数。遍历字符串t时,字符对应的索引上的数值-1;最后检查数组元素是否都为0;

代码随想录刷题-哈希表_第4张图片

349.两个数组的交集

输出结果中的元素都是唯一的,不重复的,而且不用考虑输出结果的顺序。

代码随想录刷题-哈希表_第5张图片

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。

代码随想录刷题-哈希表_第6张图片代码随想录刷题-哈希表_第7张图片

 对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指向数组结尾。根据三处位置的和移动指针。

代码随想录刷题-哈希表_第8张图片

18.两数之和

四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,

你可能感兴趣的:(散列表,数据结构,算法)