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

您所在的位置:网站首页 有效的刷题方法 【算法刷题】哈希表题型及方法归纳

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

2024-07-10 10:04| 来源: 网络整理| 查看: 265

哈希表特点

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

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

常见的三种哈希结构:

1、数组:操作简单,方便快捷,但不适于进行一些更复杂的操作。 注:适用于用set或map的情景: (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、数组作为哈希表的题

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

题目:

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

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

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

2、Set作为哈希表的题

查看元素是否出现过

题目:

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

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

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

3、Map作为哈希表的题

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

题目:

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

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

四个独立数组,不需考虑去重 √ 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循环和剪枝与去重条件进行稍微调整。

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3