1. 哈希算法基础与Hot100解题逻辑
哈希表作为算法面试中的常青树,在LeetCode Hot100题库中出现的频率高达37%。这种以空间换时间的数据结构,本质上是通过哈希函数将键(key)映射到存储位置(bucket)的快速访问机制。在Day04的速通训练中,我们主要面对的是两类典型场景:需要快速判断元素存在的验证类问题(如两数之和),以及需要统计元素频率的计数类问题(如字母异位词分组)。
哈希函数的设计直接影响冲突概率。以Java的HashMap为例,当链表长度超过8时会转为红黑树,这个阈值的设定基于泊松分布计算:在负载因子0.75时,单个哈希槽出现8个元素的概率仅为0.00000006。这也是为什么在算法题中,我们通常可以直接使用语言内置的哈希结构而不必担心性能问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高频题型深度解析
2.1 两数之和的三种实现对比
题目要求找出数组中相加等于目标值的两个数索引。暴力解法O(n²)显然不符合Hot100的考察意图。使用哈希表存储已遍历元素可将时间复杂度降至O(n),但这里有三个实现细节值得注意:
- 先检查补数再存入当前数的策略,可以避免重复使用同一元素。例如处理nums=[3,3], target=6时,若先存入再检查会错误匹配自身
- 在Python中使用字典的
in操作(if target-num in seen)比先get再判断更符合习惯 - Go语言中推荐使用
map[int]int而非map[int]struct{},因为存储索引需要int值
python复制def twoSum(nums, target):
seen = {}
for i, num in enumerate(nums):
if target - num in seen:
return [seen[target - num], i]
seen[num] = i
return []
2.2 字母异位词分组的哈希键设计
这道题的关键在于如何为异位词生成唯一的哈希键。常见方案有:
- 排序法:将单词排序后作为键,时间复杂度O(n*klogk)
- 计数法:统计字母频率作为键,如
a2b1c1,时间复杂度O(n*k) - 质数积法:为每个字母分配质数,计算乘积作为键,需处理大数溢出
实测在Python中,使用tuple(sorted(word))作为键比字符串拼接快15%。而在Java中,使用Arrays.toString(count)比拼接StringBuilder效率更高:
java复制class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
char[] count = new char[26];
for (char c : s.toCharArray()) count[c-'a']++;
S
