算法D6 | 哈希表基础 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数

本文介绍了哈希表的基础理论,包括哈希函数、碰撞处理,以及set和map的区别。通过实例探讨如何在不同场景下选择数组、set和map,如快速查找、字符计数和集合运算。同时提供了Python和C++的实现方法,涉及字符编码、数据结构选择等内容。
摘要由CSDN通过智能技术生成

哈希表理论基础 

建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。  

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。  这句话很重要,大家在做哈希表题目都要思考这句话。 文章讲解

在D4已经遇到了set/map的结构对比了,这里再补充一下对比。(from carlprogrming)

242.有效的字母异位词 

建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。 题目链接/文章讲解/视频讲解

第一反应是用python的字典结构来记录character出现的个数,再比较两个字典是否相同。如果是一个字典呢?第二个字典在原字典基础上计数递减,那么省了一半的空间,如果不用字母作为Key,而是数值(当前字母和字母a的差值),那么可以直接用数组结构(array), 因为数组也是由Index和value的对应关系来表示的, 和字典的key, value结构类似底层都是hash table。能用数组的时候尽量用数组,比另外两种结构set/map要快。

Python方法一:字典

Python方法二:数组

数组方法需要把index确定为int格式, python里用ord()函数实现,Python ord() 函数是一个内置函数,可以将一个字符转换为对应的 ASCII 或 Unicode 数值,或者将一个 ASCII 或 Unicode 数值转换为对应的字符。这里补充一些Python的编码的知识:非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有

C++方法二:数组

仅实现数组方法,声明一个指定长度元素全为0的数组的方法: record[26] = {0}。

349. 两个数组的交集 

建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。 题目链接/文章讲解/视频讲解

求集合的交集, 再转换成数组输出即可。

Python 方法一: set

Python 方法二:数组

leetcode后续把array中元素的范围限制在了[0, 1000], 所以这个题可以用数组实现。如果数字范围是可变的,那么就不是和数组,需要的空间也是无限大。

C++ 方法一: set - unordered_set

把vector内的元素全部放到unordered_set 参考line27。

C++ 方法二:数组 

202. 快乐数 

建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子。题目链接/文章讲解

Python 方法:

求digits平方参考C++方法,str的转换也是需要消耗时间的。

C++ 方法:

1. 两数之和 

建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。 

建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。题目链接/文章讲解/视频讲解

Python 方法:

C++ 方法:

注意C++中函数return {}; 不能省略。 返回list 直接写 {ele1, ele2, ...} 即可; 找到unordered_map对应key的value, 使用it-> second:

it表示按key找到的整个item。

it->first 表示的是这个元素的key的值;

it->second 表示的是这个元素的value的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值