哈希表理论基础
建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,大家在做哈希表题目都要思考这句话。
文章讲解:https://programmercarl.com/哈希表理论基础.html
242.有效的字母异位词
建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。
题目链接/文章讲解/视频讲解: https://programmercarl.com/0242.有效的字母异位词.html
/**
* @param {string} s
* @param {string} t
* @return {boolean}
* 还可以思考怎么简化代码
*/
var isAnagram = function(s, t) {
let mapS = new Map();
for(let i=0; i<s.length; i++) {
if(mapS.has(s[i])){
let num = mapS.get(s[i]);
num++;
mapS.set(s[i], num);
} else {
mapS.set(s[i], 1);
}
}
for(let i=0; i<t.length; i++){
if(!mapS.has(t[i])){
return false;
} else {
// // mapS.set(s[i], mapS.get(s[i])--);
// mapS.get(s[i])--
let num = mapS.get(t[i]);
num--
mapS.set(t[i], num);
}
}
for(let value of mapS.values()){
if(value!==0){
return false;
}
}
return true;
};
- 两个数组的交集
建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0349.两个数组的交集.html
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
* 还可以简化代码
*/
var intersection = function(nums1, nums2) {
const mapS1 = new Map();
for(let i=0;i<nums1.length;i++){
if(mapS1.has(nums1[i])){
let num = mapS1.get(nums1[i]);
num++;
mapS1.set(nums1[i], num);
}else{
mapS1.set(nums1[i], 1);
}
}
let setRes = new Set();
for(let i=0;i<nums2.length;i++){
if(mapS1.has(nums2[i])){
setRes.add(nums2[i]);
}
}
return [...setRes];
};
- 快乐数
建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子
题目链接/文章讲解:https://programmercarl.com/0202.快乐数.html
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let set = new Set();
let curNum = n;
while(!set.has(curNum)&&curNum!==1){
set.add(curNum);
let total = 0;
let nString = curNum.toString();
for(let i=0;i<nString.length;i++){
total+=Math.pow(nString[i],2);
}
curNum = total;
}
if (curNum===1) {
return true;
}
return false;
};
- 两数之和
建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。
建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0001.两数之和.html
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
* 本题思考重点,哈希表map的key和value用来存什么,一开始没想出来
*/
var twoSum = function(nums, target) {
const map = new Map();
for(let i=0;i<nums.length;i++){
let del = target -nums[i];
if(map.has(del)){
return [map.get(del), i];
} else {
map.set(nums[i], i);
}
}
return [];
};
标签:set,随想录,number,param,202,let,哈希,讲解,两数
From: https://www.cnblogs.com/yuanyf6/p/18190267