代码随想录算法训练营第六天 | 242.有效的字母异位词 、349. 两个数组的交集、 202. 快乐数 、 1. 两数之和

哈希表理论基础

建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,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;
};
  1. 两个数组的交集

建议:本题就开始考虑 什么时候用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];
    
};
  1. 快乐数

建议:这道题目也是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;
};
  1. 两数之和

建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,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 [];
};
posted @ 2024-05-13 23:08  YuanYF6  阅读(2)  评论(0编辑  收藏  举报