【算法刷题】哈希表题型及方法归纳

哈希表特点

哈希表相关理论及方法介绍:58、【查找】哈希表——拉链法和开放地址寻址法(C/C++版)

哈希表的实现代码:705. 设计哈希集合:拉链法(C++ / Python)

常见的三种哈希结构:

1、数组:操作简单,方便快捷,但不适于进行一些更复杂的操作。
注:适用于用setmap的情景:
(1)当数组大小受限;(2)数组空间足够,但存储键值稀疏;(3)Key值为非自然数(如:负数、字符等)。

2、set(集合):仅含有Key,相当于是Value=1的哈希表。常用于判定某一元素是否存在。

3、map(映射):Key-Value形式,常用于计数、存储原始数组的下标等,重点是明确要赋予Value的含义。

(1)数组的定义

在这里插入图片描述

(2)Set的三种定义

在这里插入图片描述
对于要求有序的保证Key有序,使用set,不要求保证Key有序使用unordered_set(该方式的读写效率最高),对于要求含有重复Key的使用multiset

(3)Map的三种定义

在这里插入图片描述
对于要求有序的保证Key有序,使用map,不要求保证Key有序使用unordered_map(该方式的读写效率最高),对于要求含有重复Key的使用multimap

1、数组作为哈希表的题

元素可以与数组下标按某种规则,一一对应。

题目:

  1. 小写字母ASCII码转换
    67、【哈希表】leetcode——242. 有效的字母异位词(C++版本)
    本题可利用都为小写字母的条件,根据ASCII码的特点,将每个字符中的数都减去a,映射到0-25当中,设置一个常量级空间大小的数组作为哈希表。

  2. 小写字母ASCII码转换
    383. 赎金信
    思路与242. 有效的字母异位词相同,找到哈希表中可以字母可以拼凑出另一个字符串的字母即可,也利用小写字母的条件,映射到0-25当中。

  3. 用哈希表统计某一字母在字符串中最后出现的位置
    140、【贪心算法】leetcode ——763. 划分字母区间(区间边界更新)(C++版本)
    根据哈希表中信息,寻找最远右边界。

2、Set作为哈希表的题

查看元素是否出现过

题目:

  1. 判定元素是否出现过,元素去重
    68、【哈希表】leetcode——349. 两个数组的交集(C++版本)
    目标是寻找两个数组中的去重交集,因此只需要看有无出现相同元素即可,因键值可能会很稀疏,采用unordered_set作为哈希表即可。

  2. 判定是否再次计算出某一元素
    69、【哈希表】leetcode——202. 快乐数(C++版本)
    本题的关键是出现无限循环数和满足相加为1,对于出现无限循环数条件,相当于是判定是否有再次出现该数,用unordered_set做记录即可。

  3. 判定单词首尾是否有元音字母
    199、【哈希表】leetcode ——6315. 统计范围内的元音字符串数(C++版本):使用哈希表存储元音字母,枚举每个单词的首尾字母是否有元音字母。

3、Map作为哈希表的题

不需考虑去重,需用到Value值进行某种判定

题目:

  1. 答案唯一,不需考虑去重
    70、【哈希表】leetcode——1. 两数之和(C++版本)
    要求返回满足相加为target的两个数的下标值,因此需要用map形式存储下标,其中数组中的数作为Key,下标作为Value

  2. 允许交集中有重复元素,不需考虑去重
    71、【哈希表】leetcode——350. 两个数组的交集 II(C++版本)
    因交集不去重,可存在重复元素,便将对应元素为KeyValue作为对应元素出现的次数。

  3. 四个独立数组,不需考虑去重
    72、【哈希表】leetcode——454. 四数相加 II(C++版本)
    采用两两相加组成新集合的方式,将四个集合,组合成两个集合,这个题便变为求两集合之和为0。让nums1[i] + nums2[j]构成一个集合,映射成一个Hash表,Key为nums1[i]+nums2[j],Value为该值出现的次数。让nums3[k] + nums4[l]构成另一个集合。符合目标条件的值,变为集合中数值等于0-(nums1[i]+nums2[j])的值。每找到一次满足该值情况,就将集合1中符合该情况的次数相加。

    - 需考虑去重的nSum:
    均采用先排序,再双指针的方式进行处理

    73、【哈希表】leetcode——15. 三数之和(C++版本)
    采用排序+双指针的方式,重点是剪枝条件和去重条件。

    74、【哈希表】leetcode——18. 四数之和(C++版本)
    思路与三数之和相同,区别在于多一层for循环和剪枝与去重条件进行稍微调整。

  4. 用unordered_map中存储各数出现频率
    106、【树与二叉树】leetcode ——501. 二叉搜索树中的众数:双指针法+哈希表法(C++版本)

  5. 结合哈希表,找到前缀和相同的位置,计算最长区间长度
    201、【数组】leetcode ——面试题 17.05. 字母与数字(C++版本)

  6. 结合哈希表,找到相同的前缀和,两两配对每次加上出现对应前缀和的次数,计算最长区间长度
    202、【数组】leetcode ——2588. 统计美丽子数组数目(C++版本)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值