AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← OD 20 天课程

华为 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=7map={} → 存入 {2:0}
i=1, num=7 → anotherNum=2map={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 []