LeetCode | 两数之和

505 字
3 分钟
LeetCode | 两数之和

分类:哈希表

题目#

给定一个整数数组 nums 和一个整数 target,需要找出数组中两个不同位置的元素,使它们的和等于 target,并返回这两个元素的下标。

题目保证每组输入恰好存在一个答案。同一个元素不能使用两次。返回的两个下标顺序通常不重要。

示例:

输入: nums = [2, 7, 11, 15], target = 9
输出: [0, 1]
原因: nums[0] + nums[1] = 2 + 7 = 9
输入: nums = [3, 2, 4], target = 6
输出: [1, 2]
输入: nums = [3, 3], target = 6
输出: [0, 1]

讲解#

目标是找两个数,它们相加等于 target

最直接的做法是两层循环,把所有组合都试一遍。时间复杂度是 O(n^2),空间复杂度是 O(1)

更好的做法是用字典记录已经见过的数字。Python 的字典就是一种哈希表,可以理解成“快速查找表”,这里保存的是:

数字 -> 下标

当遍历到当前数字 num 时,只需要看字典里有没有 target - num。如果有,这两个数就正好组成答案。

哈希表会根据要查的数字快速定位位置,不是像列表那样从头到尾一个个比较。need in seen 查的是字典,平均查找复杂度是 O(1),所以不会把整体复杂度变回 O(n^2)

关键点是:先查需要的数,再记录当前数。这样不会把同一个元素用两次。

复杂度:

  • 暴力做法:时间复杂度 O(n^2),空间复杂度 O(1)
  • 字典做法:时间复杂度 O(n),空间复杂度 O(n)

代码#

源码#

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
_hash = {}
for i,num in enumerate(nums):
find = target - num
if( find in _hash ):
return [_hash[find],i]
_hash[num] = i
return []

测试#

from src.python._001_Two_Sum import Solution
sol = Solution()
assert sol.twoSum([2, 7, 11, 15], 9) == [0, 1]
assert sol.twoSum([3, 2, 4], 6) == [1, 2]
assert sol.twoSum([3, 3], 6) == [0, 1]
print("PASS")

参考资料#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

LeetCode | 两数之和
https://leetcode.cn/problems/two-sum/
作者
平昊阳
发布于
2026-07-31
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
66
分类
16
标签
93
总字数
477,284
运行时长
0
最后活动
0 天前

文章目录