代码随想录算法训练营|Day 6

Day 6

今日任务

●  哈希表理论基础

●  242.有效的字母异位词

●  349. 两个数组的交集

●  202. 快乐数

●  1. 两数之和

详细布置

哈希表理论基础

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

知识点:
什么时候想到用哈希法:当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

文章讲解:https://programmercarl.com/哈希表理论基础.html

242.有效的字母异位词

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

题目链接/文章讲解/视频讲解: https://programmercarl.com/0242.有效的字母异位词.html

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        count = [0]*26

        for l1 in s:
            count[ord(l1) - ord('a')] += 1
        
        for l2 in t:
            count[ord(l2) - ord('a')] -= 1

        for i in range(26):
            if count[i] != 0:
                return False
        return True

349. 两个数组的交集

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

题目链接/文章讲解/视频讲解:https://programmercarl.com/0349.两个数组的交集.html

知识点:

哈希表:最擅长解决→给你一个元素,判断在这个集合中是否出现过

**具体用哪个:数组 or set or 哈希表?
数值很大,用数组就不合适了,需要用set
数值可能不是很大,但数值分布很分散(大得很大,小的很小,小的到大增长很快那种),这种情况下用数组会浪费很多存储空间。这种情况下用set更合适

c++中:set and multi-set底层实现是红黑树 unordered set底层实现是使用哈希值的方式

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
    # 使用哈希表存储一个数组中的所有元素
        table = {}
        for num in nums1:
            table[num] = table.get(num, 0) + 1
        
        # 使用集合存储结果
        res = set()
        for num in nums2:
            if num in table:
                res.add(num)
                del table[num]
        return list(res)
posted @ 2025-06-16 23:30  ForeverEver333  阅读(11)  评论(0)    收藏  举报