华为 OD 训练营 · 题解精讲
LC1. 两数之和
LC1. 两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3: 输入:nums = [3,3], target = 6 输出:[0,1]
提示: 2 <= nums.length <= 10(4) -10(9) <= nums[i] <= 10(9) -10(9) <= target <= 10(9) 只会存在一个有效答案
题目解析
解题思路
本题要求在数组中找出两个和为 target 的元素并返回其下标。核心思路是利用哈希表(字典)记录已遍历过的元素及其下标,在遍历过程中检查当前元素的“补数”(target - num)是否已在哈希表中。若存在,则说明找到了答案;若不存在,则将当前元素存入哈希表供后续匹配。这样只需一次遍历即可完成查找。
数据结构:哈希表(Python 字典),以元素值为键,下标为值。
算法:一次遍历 + 哈希表查询。
关键步骤
1. 初始化空字典 map。 2. 遍历数组 nums,对每个元素 num 及其下标 i:
- 计算补数
anotherNum = target - num。 - 检查
anotherNum是否在map中: - 若存在,则返回
[map[anotherNum], i](注意先返回补数的下标,再返回当前下标)。 - 若不存在,则将
(num, i)存入map。
3. 若遍历结束仍未找到,返回空列表 [](题目保证有解,此步仅为代码完整性)。
示意图(以 nums = [2,7,11,15], target = 9 为例):
i=0, num=2 → anotherNum=7 → map={} → 存入 {2:0}
i=1, num=7 → anotherNum=2 → map={2:0} → 找到 2,返回 [0,1]复杂度分析
- 时间复杂度:O(n),其中 n 为数组长度。只需一次遍历,每次哈希表查询和插入均为 O(1)。
- 空间复杂度:O(n),最坏情况下哈希表存储 n-1 个元素。
参考代码
登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# 两数之和(LeetCode 1):https://leetcode-cn.com/problems/two-sum/
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 首先构建一个哈希表,用来存放数组的元素值以及索引值
# 其中 key 是数组中的元素值
# value 为数组中元素值的索引
map = dict()
# 接下来,遍历整个数组
for i, num in enumerate(nums):
# 目标值为 target,将 target 与 nums[i] 求差
# 获取与 nums[i] 配对的那个数 anotherNum
anotherNum = target - num
# 判断哈希表中是否存在那个与 nums[i] 配对的数 anotherNum
if anotherNum in map :
# 由于哈希表中所有 key 都是来自于数组中,
# 所以,如果发现哈希表存在那个与 nums[i] 配对的数 anotherNum
# 也就说明数组中存在一个数,可以和 nums[i] 相加为 target
# 此时, anotherNum 这个 key 对应的 value 为这个数在数组中的索引
# 所以,返回 map.get(anotherNum) 和 i 就是这两个值的下标
return [ map[ anotherNum ] , i ]
else:
# 如果发现哈希表中目前不存在那个与 nums[i] 配对的数 anotherNum
# 那么就把此时观察的数 nums[i] 和它的索引存放到哈希表中
# 等待后面的数能和它配对为 target
map[nums[i]] = i
# 如果遍历完整个数组都找不到和为 target 的两个数,返回 0
return []