leetcode(5):哈希表一,使用dict和set代替hash表

哈希表理论

 💡 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

例如要查询一个名字是否在这所学校里。

要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。

我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。

主要是通过哈希函数进行映射。

哈希函数

哈希表本质是一个数组,哈希函数是将所需要的东西映射为索引,因此可以实现索引的直接读取。

哈希碰撞

拉链法

线性探测法

要求tablesize大于datasize,否则会放不下,其实就是往后接着找,一直找到有空位为止

常见的哈希结构

  • 数组
  • set(集合)
  • map(映射)

哈希:牺牲了空间来换取时间

  • 哈希表如何创建数组

242.有效的字母异位词

并不知道哈希表该怎么在代码中体现,先直接看了答案;dict也是可行的,注意defaultdict的用法

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:

        record = [0]*26 # 创建26个字母的哈希表
        for i in range(len(s)):
            # 记录s中每个字母出现的次数
            record[ord(s[i]) - ord('a')] += 1 # 相对的位置

        for i in range(len(t)):
            # 减去在t中字母出现的次数
            record[ord(t[i]) - ord('a')] -= 1

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

        return True

349. 两个数组的交集

感觉很简单,直接就做出来了

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        hash1, hash2 = [0]*1001 , [0]*1001
        for element in nums1:
            hash1[element] = 1
        
        for element in nums2:
            hash2[element] = 1
        
        result = []
        for i in range(1001):
            if hash1[i] == 1 and hash2[i] == 1:
                result.append(i)

        return result

第202题. 快乐数

思路是对的,但是记住平方是**,不是 ^, 天大的教训😭

class Solution:
    def isHappy(self, n: int) -> bool:
        
        hash = set()

        while True:
            if n == 1:
                return True
            
            next_n = 0
            while n :
                next_n += (n%10) **  2
                n = n//10

            if next_n in hash:
                return False
            else:
                hash.add(next_n)
            
            n = next_n

1. 两数之和

easy,只要想到用过的信息需要保留再次用就行了

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        record = dict()

        for i in range(len(nums)):
            if nums[i] in record:
                return [record[nums[i]],i]
            else:
                record[target-nums[i]] = i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值