哈希算法题目:两数之和 III - 数据结构设计
字数 1197 2025-10-26 19:15:23
哈希算法题目:两数之和 III - 数据结构设计
题目描述
设计一个数据结构 TwoSum,支持以下两种操作:
add(number):向数据结构添加一个数number。find(value):检查是否存在任意一对数字,其和等于value。若存在返回true,否则返回false。
注意:
- 添加的数可能包含重复值(例如多次添加同一个数)。
- 在
find操作中,需要确保找到的两个数可以是同一个数(但必须是添加过两次的同一个数),例如添加[3, 3]后,find(6)应返回true。
解题思路
-
核心需求分析:
- 需要高效支持动态添加数字和快速查询是否存在满足条件的数对。
- 重复数字的存在要求记录每个数字的出现频次,而不仅仅是存在性。
-
数据结构选择:
- 使用哈希表(字典)存储每个数字及其出现次数。键为数字,值为该数字被添加的次数。
- 例如:添加
[1, 3, 3, 5]后,哈希表为{1:1, 3:2, 5:1}。
-
find操作的逻辑:- 遍历哈希表中的每个数字
num,计算补数complement = value - num。 - 分两种情况:
- 若
complement == num,则需要检查该数字的出现次数是否至少为 2(例如两个 3 的和为 6)。 - 若
complement != num,则需要检查补数是否存在于哈希表中。
- 若
- 注意避免同一数字被重复使用(如仅有一个 3 时无法匹配自身)。
- 遍历哈希表中的每个数字
逐步示例
- 初始化:
TwoSum对象内部哈希表freq = {}。 - 操作序列:
add(1)→freq = {1:1}add(3)→freq = {1:1, 3:1}add(3)→freq = {1:1, 3:2}add(5)→freq = {1:1, 3:2, 5:1}
- 查询示例:
find(4):遍历哈希表:- 取
num=1,补数complement=3,存在且3≠1→ 返回true。
- 取
find(6):- 取
num=3,补数complement=3,需检查出现次数freq[3]≥2→ 满足 → 返回true。
- 取
find(7):- 遍历所有键均不满足条件(如
num=5时补数为 2,但 2 不存在) → 返回false。
- 遍历所有键均不满足条件(如
复杂度分析
add操作:时间复杂度 O(1),直接更新哈希表。find操作:时间复杂度 O(n),需要遍历哈希表的所有键(n 为不同数字的个数)。- 空间复杂度:O(n),存储所有不重复数字及其频次。
边界情况
- 多次添加同一数字时,频次正确累加。
- 查询时注意数字匹配自身的情况(频次需 ≥2)。
- 空数据结构时
find直接返回false。