1. 哈希算法基础与LeetCode实战解析
哈希表作为数据结构中的瑞士军刀,在算法面试中出场率高达70%以上。我在刷完LeetCode全部哈希相关题目后发现,真正需要死记硬背的解法很少,关键是要掌握"空间换时间"的核心思想。下面通过Hot100经典题型,带你拆解哈希的实战应用技巧。
提示:本文代码示例以Java为主,但思路适用于所有语言,文末会提供Python对照版本
1.1 哈希表本质解析
哈希表(Hash Table)本质是键值对存储结构,其高效性来自哈希函数的精心设计。理想状态下:
- 插入/删除时间复杂度:O(1)
- 查找时间复杂度:O(1)
实际工程中需要考虑:
- 哈希冲突处理(开放寻址法/链地址法)
- 负载因子控制(Java HashMap默认0.75)
- 动态扩容机制(容量翻倍+rehash)
java复制// 典型HashMap初始化参数
Map<String, Integer> map = new HashMap<>(16, 0.75f);
2. 两数之和的深度优化
2.1 暴力法到哈希的进化
原始暴力解法O(n²)的缺陷很明显:
python复制for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
哈希解法之所以能降为O(n),核心在于:
- 用Map存储已遍历元素(值→索引)
- 每次检查
target - current是否存在于Map
2.2 边界条件处理实战
java复制class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}
map.put(nums[i], i); // 先判断后插入避免自匹配
}
throw new IllegalArgumentException("No solution");
}
}
避坑指南:元素重复时,必须先检查再放入Map。例如target=6,nums=[3,3],如果先put后检查会得到[0,0]的错误结果
