【代码随想录-刷题学习JavaScript】day3-哈希表

一、哈希表理论基础
二、242.有效的字母异位词
三、349. 两个数组的交集
四、202. 快乐数
五、1. 两数之和
六、454.四数相加II
七、383. 赎金信
八、15. 三数之和
九、18. 四数之和

一、 哈希表理论基础

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

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

文章讲解

1、哈希表:表示一种映射。查询O(1)

2、哈希函数: 数据 →(hashCode % tableSiize)下标对应映射
hashCode得到的索引,保证索引都落在hash表上

3、哈希碰撞:多个数据在同一个索引上时
(拉链法、线性探测法)

4、常见哈希表

类别 适用场景
数组 数据不大,数据范围可控
set 数据大
map 要存的不止数值,还有映射关系

二、242.有效的字母异位词

建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。

文章讲解

异位词,是相同字母组成的两个词,位置一样或者不一样。
如果暴力2层for循环O(n²)
换成数组的哈希表,只需要单独3次for循环O(n):
①遍历一个词中每个字母,借用a-z 26个小写字母的ASCII码,来当做数组的存储下标,value是此字母出现的次数。形成巧妙的映射关系。
②遍历另一个词,相同下标处的value–
③最后遍历此哈希数组,其中如果有不等于0的,就代表不是异位词


三、349. 两个数组的交集

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

文章讲解


四、202. 快乐数

建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子

文章讲解


五、1. 两数之和

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

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

文章讲解


六、 454.四数相加II

建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法
会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。

文章讲解


七、383. 赎金信

建议:本题 和 242.有效的字母异位词 是一个思路 ,算是拓展题

文章讲解


八、15. 三数之和

建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下
双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。
文章讲解


九、 18. 四数之和

建议: 要比较一下,本题和 454.四数相加II 的区别,为什么 454.四数相加II 会简单很多,这个想明白了,对本题理解就深刻了。 本题
思路整体和 三数之和一样的,都是双指针,但写的时候 有很多小细节,需要注意,建议先看视频。

文章讲解


十、总结

1、哈希表理论基础

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

2、经典题目

(1)242.有效的字母异位词 ——哈希数组

异位词,是相同字母组成的两个词,位置一样或者不一样。
如果暴力2层for循环O(n²)
换成数组的哈希表,只需要单独3次for循环O(n):
①遍历一个词中每个字母,借用a-z 26个小写字母的ASCII码,来当做数组的存储下标,value是此字母出现的次数。形成巧妙的映射关系。
②遍历另一个词,相同下标处的value–
③最后遍历此哈希数组,其中如果有不等于0的,就代表不是异位词

(2)349. 两个数组的交集 ——哈希set

(3)202. 快乐数 ——哈希set

(4)1. 两数之和——哈希map

(5)454.四数相加II ——哈希map

(6)383. 赎金信 ——哈希数组

(7)15. 三数之和 ——区别于两数之和-用双指针

(8)18. 四数之和——区别于两数之和-用双指针

3、JS中三种哈希常用API

(1)数组

基础操作 数组
创建 ①var arr = []; ② var arr = new Array(n).fill(0)
获取数组长度 arr.legth
获取数组index下标的值 arr[index]
改数组某一项的值 可以通过索引值、下标index获取数组元再通过赋值方式更改数组某一项的值
增加数组长度 ①arr.length = 某个大于原数组长度的值②arr[某个大于原数组长度的值] = 这一项的值
减少数组长度 arr.length = 某个小于原数组长度的值
数组长度于与数组项之间关系 arr[arr.length-1] = arr的最后一项
遍历 下标在 0 到 arr.length-1 之间,进行 for 循环遍历
更常用的API 数组
转字符串 ①toString() ②join()
在数组末尾添加一个或多个元素,逗号分隔,返回数组操作后的长度 push()
删除数组最后一项,返回删除项 pop()
删除数组第一项,返回删除项 shift()
传参方式与push类似。在数组开头添加一个或多个元素,并返回数组的新长度 unshift()
合并,将两个数组合并成一个新的数组,原数组不受影响 concat()
拆分。当前数组中截取一个新的数组,不影响原来的数组,返回一个新的数组,包含从 start 到end (不包括该元素)的元素参数区分正负,正值表示下标位置,负值表示从后面往前数第几个位置; slice(start,end)
删除、插入、替换 splice(index,howmany,element1,element2,……)
用于插入、删除或替换数组的元素。index,删除元素的开始位置。howmany,删除元素的个数,可以是0。element1,element2,要替换的新的数据
查找数据在数组中从前往后,最后一次出现的下标。注意:如果没找到返回-1 indexOf()
查找数据在数组中从前往后,最后一次出现的下标。注意:如果没找到返回-1 lastIndexOf()
倒序 reverse()
排序:默认根据字符编码顺序,从小到大排序 sort()
清空数组 ①arr = [];②arr.length = 0;③arr.splice(0, arr.length);
遍历相关API 数组
forEach(函数(value, index) ) 该方法等同于for循环,没有返回值
map(函数(value, index)) 该方法使用和forEach大致相同,但是该方法有返回值,返回一个新数组,新数组的长度和原数组长度相等
filter(函数(value, index) 有返回值, 过滤出符合条件的元素
some(函数(value, index)) 判断数组中有没有符合条件的项(只要有,就返回true),如果一个都没有,才返回false
every(函数(value, index)) 判断数组中所有的项是否满足要求,如果全都满足,才返回true,否则返回false
find(函数(value, index)) 找到符合条件的项,并且返回第一项
findIndex(函数(value, index)) 找到符合条件的项的下标,并且返回第一个
reduce(前一个值,当前值,项的索引,数组对象) 迭代数组的所有项,然后构建一个最终返回的收
reduceRight(前一个值,当前值,项的索引,数组对象) 从数组的最后一项开始,向前遍历到第一项

(2)set

操作及属性 set
新建 const s = new Set()
添加 add()
获取长度属性 size
判断集合中是否有某个数据的方法,返回布尔值 has()
删除方法,删除成功返回true,否则返回false delete()
全部删除方法,清除当前集合中全部数据 clear()
遍历 forEach()或用ES2015中新的for…of方法也行
/*1. 将数组传递给new Set() 的参数;
2. 这时得到的是集合数据类型
3. 转回数组
● 方法1:ES2015中的新方法 Array.from()
● 方法2:... 操作符
*/
// 数组去重
const arr = [1.3,4,6,2,4,7,5,8]
// const b = Array.from(new Set(arr))
const b = [...new Set(arr)]
console.log(b) 

(3)map

操作 map
新建 const map = new Map()
添加值 set(键,值) 比如 map.set(‘a’,100)
获取某key对应值 get(key)
判断是否有某项数据 has()
删除某项的值 delete(key)
遍历 forEach(value,key)
const map = new Map()
const a = {a: 1}
map.set(a,100)
const b = {b: 2}
map.set(b,200)
//形参的顺序就是就是value,key 打印出来的顺序才是 key,value
map.forEach( (value,key) => {
  console.log(key,value)
})

在这里插入图片描述


你可能感兴趣的:(学习,数据结构,哈希表,javascript,map)