哈希结构 Hash

本文介绍了哈希结构,如数组vector、集合set和映射dict,并通过多种算法题目的解题思路展示了哈希结构在查找、求交集、字母异位词等问题中的应用。涉及的算法包括两数之和、字母异位词、赎金信、快乐数等。通过这些实例,读者可以深入理解哈希结构的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈希表也叫散列表,用来快速判断一个元素是否出现集合里,把需要查询的内容映射为哈希表中的索引,牺牲空间换取时间

哈希碰撞解决方法:拉链法(存储在链表中);线性探测法(寻找其他合适的空位)

哈希结构:vector(数组), set(集合), map(映射)

底层实现:set/map & multiset/multimap 红黑树(平衡二叉搜索树,key值有序,不可修改,只能删除和增加);unordered_map/unordered_set 哈希表 (key无序,不可修改)

n数之和问题:满足条件的下标、所有满足条件的n元组、共有多少个满足条件的元组、是否存在满足条件的元组;解题方法:字典(和与出现次数的映射),双指针,三指针(固定1个指针,其他两个指针靠近)

具体见下面每题的解题思路,搞懂这些题,基本就掌握了哈希结构的运用

数组vector

大小有限,节约空间,一般用于字符串中字符的类型已知且固定(比如26个英文字母)

242 有效的字母异位词

  • easy
  • 题目描述

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

  • 解题思路

用字典统计s中的每个字母及其对应出现的次数;遍历t,依次将每个字母从字典中抵消掉,如果t是s的字母异位词,那么最终字典所有value都是0,否则的话说明t不是s的字母异位词

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 用一个大小为26的数组记录s中所有字母出现的次数
        ans = [0 for i in range(26)]
        # 统计s
        for i in range(len(s)):
            idx = ord(s[i]) - ord('a')
            ans[idx] += 1
        # 抵消t
        for i in range(len(t)):
            idx = ord(t[i]) - ord('a')
            ans[idx] -= 1
        # ans中是否每一位都是0
        for i in range(26):
            if ans[i] != 0:
                return False
        return True

383 赎金信

  • easy
  • 题目描述

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

  • 解题思路

和上面一题的思路一样,只不过根据题意,需要判断的是一个字符串是否能由另一个字符串构成,说明最终要判断的是字典中每个字母是否出现次数≥0,否则的话说明无法构成另一个字符串

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        # 和字母异位词类似,但是这题是包含关系,而不是相等关系
        ans = [0 for i in range(26)]
        # 统计magazine
        for i in range(len(magazine)):
            idx = ord(magazine[i]) - ord('a')
            ans[idx] += 1
        # 抵消ransomNote
        for i in range(len(ransomNote)):
            idx = ord(ransomNote[i]) - ord('a')
            ans[idx] -= 1
        # 判断是否ans每一项都大于等于0
        for i in range(26):
            if ans[i] < 0:
                return False
        return True

集合 set

349 两个数组的交集

  • easy
  • 题目描述

给定两个数组,编写一个函数来计算它们的交集。

  • 解题思路

直接用python中自带的set()将list转换成集合,&表示求交集,最后转换返回值类型为list

class Solution:
    def intersection(self, nums1: List[int], nums2: List[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值