两数之和题目解析 豆包MarsCode AI刷题

42 阅读3分钟

以下以 MarsCode AI 刷题题库中的“两数之和”题目为例进行解析:

一、题目描述

给定一个整数数组  nums  和一个目标值  target ,在数组中找出两个数,使它们的和等于目标值,并返回这两个数的索引。

二、思路

1. 暴力解法思路

  • 最直接的思路是使用两层循环遍历数组。外层循环遍历数组中的每个元素,内层循环从外层循环当前元素的下一个位置开始遍历,对于每一对元素,计算它们的和并与目标值比较。如果和等于目标值,则返回这两个元素的索引。这种方法简单易懂,但时间复杂度较高,为  ,其中   是数组的长度。因为对于每个元素都要与后面的所有元素进行一次比较。 2. 哈希表解法思路
  • 为了提高效率,可以使用哈希表。遍历数组时,对于每个元素  nums[i] ,计算出它与目标值的差值  complement = target - nums[i] 。然后检查这个差值是否已经在哈希表中。如果在,说明找到了两个数的和等于目标值,直接返回当前元素的索引和差值在哈希表中对应的索引。如果不在,将当前元素及其索引存入哈希表,继续遍历下一个元素。这种方法的时间复杂度为  ,因为哈希表的查找操作平均时间复杂度接近  。

三、图解(以哈希表解法为例)

假设数组  nums = [2, 7, 11, 15] ,目标值  target = 9 。

1. 初始化一个空哈希表。 2. 遍历数组的第一个元素  2 :

  • 计算差值  complement = 9 - 2 = 7 。
  • 此时哈希表中没有  7 ,将  2  及其索引  0  存入哈希表。 3. 遍历到第二个元素  7 :
  • 计算差值  complement = 9 - 7 = 2 。
  • 发现哈希表中存在  2 ,其索引为  0 ,所以找到了满足条件的两个数,返回  [0, 1] 。

四、代码详解

1. 暴力解法代码

python

def twoSum(nums, target): for i in range(len(nums)): for j in range(i + 1, len(nums)): if nums[i] + nums[j] == target: return [i, j]  

  • 外层循环  for i in range(len(nums))  遍历数组  nums  的每个元素。
  • 内层循环  for j in range(i + 1, len(nums))  从  i  的下一个位置开始遍历,确保不会重复计算同一对元素。
  • 当  nums[i] + nums[j] == target  时,返回  [i, j] ,即找到的两个数的索引。

2. 哈希表解法代码

python

def twoSum(nums, target): num_dict = {} for i, num in enumerate(nums): complement = target - num if complement in num_dict: return [num_dict[complement], i] else: num_dict[num] = i  

  • 首先初始化一个空字典  num_dict  用于存储元素及其索引。
  • 然后使用  enumerate  函数遍历数组, i  为索引, num  为当前元素。
  • 计算差值  complement = target - num 。
  • 如果  complement  在字典  num_dict  中,说明找到了满足条件的两个数,返回  [num_dict[complement], i] 。
  • 如果不在,将当前元素  num  及其索引  i  存入字典  num_dict ,继续遍历下一个元素。