以下以 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 ,继续遍历下一个元素。