今天咱们聊聊哈希表这个数据结构中的瑞士军刀。作为算法面试中的常客,哈希表以其O(1)时间复杂度的查询特性,成为解决各类查找问题的首选方案。我结合自己刷题和面试的经验,带大家用4道经典LeetCode题目(242、349、202、1)彻底掌握哈希表的应用技巧。
哈希表本质上是通过哈希函数将键(key)映射到存储位置的数据结构。想象你有一个巨大的图书馆,哈希函数就像图书管理员,能根据书名直接告诉你书放在哪个书架的第几层,而不需要逐个书架查找。这种直接定位的能力,使得插入、删除、查找操作都能在平均O(1)时间内完成。
在实际工程中,哈希表被广泛应用于:
注意:哈希表虽然查询快,但需要额外空间存储哈希桶,属于典型的空间换时间策略。当数据量极大时,可能面临哈希冲突问题。
给定两个字符串s和t,判断t是否是s的字母异位词(即字母相同但排列顺序不同)。
示例:
code复制输入: s = "anagram", t = "nagaram"
输出: true
核心思路:统计每个字母出现的次数是否一致。
python复制def isAnagram(s: str, t: str) -> bool:
if len(s) != len(t):
return False
count = [0] * 26 # 使用数组模拟哈希表
for char in s:
count[ord(char) - ord('a')] += 1
for char in t:
count[ord(char) - ord('a')] -= 1
if count[ord(char) - ord('a')] < 0:
return False
return True
优化技巧:
给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素必须是唯一的。
示例:
code复制输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
方法一:暴力搜索
python复制def intersection(nums1, nums2):
result = []
for num in nums1:
if num in nums2 and num not in result:
result.append(num)
return result
时间复杂度:O(m*n),不推荐
方法二:使用集合
python复制def intersection(nums1, nums2):
return list(set(nums1) & set(nums2))
时间复杂度:O(m+n),最优解
方法三:排序+双指针
python复制def intersection(nums1, nums2):
nums1.sort()
nums2.sort()
i = j = 0
result = set()
while i < len(nums1) and j < len(nums2):
if nums1[i] == nums2[j]:
result.add(nums1[i])
i += 1
j += 1
elif nums1[i] < nums2[j]:
i += 1
else:
j += 1
return list(result)
时间复杂度:O(nlogn + mlogm)
实际面试中,推荐先提出集合解法,再根据面试官要求讨论其他方法。
快乐数是指:对于一个正整数,每次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或者无限循环但始终变不到1。如果可以变为1,这个数就是快乐数。
示例:
code复制输入:19
输出:true
解释:
1² + 9² = 82
8² + 2² = 68
6² + 8² = 100
1² + 0² + 0² = 1
关键点:检测循环是解题的核心。当计算结果开始重复时,说明进入了无限循环。
python复制def isHappy(n: int) -> bool:
seen = set()
while n != 1:
if n in seen:
return False
seen.add(n)
n = sum(int(d)**2 for d in str(n))
return True
优化方向:
给定一个整数数组nums和一个整数目标值target,在数组中找出和为目标值的那两个整数,并返回它们的数组下标。
示例:
code复制输入:nums = [2,7,11,15], target = 9
输出:[0,1]
一次遍历法:
python复制def twoSum(nums, target):
num_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return [num_map[complement], i]
num_map[num] = i
return []
为什么这样高效?
经过这四道题的训练,我总结出哈希表应用的几个关键点:
在实际面试中,建议按照以下步骤解题:
最后分享一个实用技巧:当遇到"查找"、"去重"、"统计频率"等关键词时,哈希表往往是最佳选择。但也要注意,哈希表不是万能的,比如需要有序数据时,可能需要考虑平衡二叉搜索树等结构。