1. 哈希算法实战精解
哈希表作为算法领域的瑞士军刀,其O(1)时间复杂度的查询特性使其成为解决各类问题的利器。在实际工程和算法面试中,合理运用哈希可以大幅提升程序效率。下面我们通过典型例题深入剖析哈希的应用技巧。
1.1 两数之和的两种解法对比
给定整数数组nums和目标值target,找出和为target的两个数的索引。这个看似简单的问题却蕴含着算法优化的经典思路。
1.1.1 暴力枚举法
python复制class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
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²) —— 对于n个元素,需要检查n(n-1)/2种组合
- 空间复杂度:O(1) —— 仅使用常数空间
实际工程中,当n>10⁴时这种解法就会明显变慢。我在处理大规模数据时曾因使用暴力法导致接口超时,教训深刻。
1.1.2 哈希优化法
python复制class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashmap = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hashmap:
return [hashmap[complement], i]
hashmap[num] = i
哈希解法通过空间换时间:
- 时间复杂度:O(n) —— 只需单次遍历
- 空间复杂度:O(n) —— 存储元素到索引的映射
关键技巧:
- 在遍历时动态构建哈希表,避免预处理
- 先检查补数再插入当前数,防止重复使用同一元素
- 存储索引而非值,便于直接返回结果
1.2 字母异位词分组的哈希技巧
字母异位词指字母相同但排列不同的单词,如"eat"和"tea"。分组这类词需要找到统一的哈希键。
1.2.1 排序哈希法
python复制class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
hashmap = {}
for s in strs:
key = "".join(sorted(s))
if key not in hashmap:
hashmap[key] = []
hashmap[key].append(s)
return list(hashmap.values())
算法核心:
- 将每个单词排序后作为哈希键
- 相同键的单词归为同一组
- 时间复杂度:O(nklogk),其中n是单词数,k是最大单词长度
我在实际项目中处理用户搜索词时,曾用此法快速识别近义词。注意Python中字符串排序需先转为list再join,这是常见陷阱。
1.2.2 计数哈希法(优化变种)
对于仅含小写字母的场景,可用计数数组替代排序:
python复制def groupAnagrams(strs):
hashmap = {}
for s in strs:
co
