数据结构与算法之 leetcode 哈希表两数之和 II 有序数组

数据结构与算法阿木 发布于 2025-07-12 6 次阅读


LeetCode:两数之和 II(有序数组)的哈希表解决方案解析

LeetCode 是一个在线编程竞赛平台,提供了大量的编程题目,旨在帮助程序员提升算法和数据结构的能力。在 LeetCode 的题目中,两数之和 II(有序数组)是一道经典的哈希表应用题。本文将围绕这一主题,深入解析哈希表在解决两数之和问题中的应用,并给出一个详细的代码实现。

题目描述

给定一个已按照升序排列的整数数组 nums 和一个目标值 target,找出并返回两个数,使得这两个数的和等于 target。返回的结果应该以数组形式返回,其中第一个元素是较小的那个数,第二个元素是较大的那个数。

解题思路

由于数组是有序的,我们可以采用双指针的方法来解决这个问题。双指针分别指向数组的两端,然后根据两数之和与目标值的关系来移动指针。这种方法的时间复杂度为 O(n),对于较大的数组可能不是最优解。

哈希表可以提供一种更高效的方法。我们可以遍历数组,将每个元素及其索引存储在哈希表中。在遍历过程中,我们可以检查哈希表中是否存在与当前元素相加等于目标值的另一个元素。如果存在,则找到了答案。这种方法的时间复杂度为 O(n),空间复杂度为 O(n)。

代码实现

下面是使用哈希表解决两数之和 II(有序数组)问题的 Python 代码实现:

python

def twoSum(nums, target):


num_to_index = {}


for i, num in enumerate(nums):


complement = target - num


if complement in num_to_index:


return [num_to_index[complement] + 1, i + 1]


num_to_index[num] = i


return []

示例


nums = [2, 7, 11, 15]


target = 9


print(twoSum(nums, target)) 输出: [1, 2]


代码解析

1. `num_to_index` 是一个字典,用于存储数组元素及其索引。

2. 使用 `enumerate` 函数遍历数组,`num` 是当前元素,`i` 是当前元素的索引。

3. 计算 `complement`,即当前元素与目标值的差。

4. 检查 `complement` 是否在 `num_to_index` 中,如果在,则找到了答案,返回一个包含两个索引的列表。

5. 如果没有找到,将当前元素及其索引存储在 `num_to_index` 中。

6. 如果遍历完整个数组都没有找到答案,返回空列表。

优化与扩展

1. 空间优化:如果数组中存在重复元素,我们可以通过检查 `complement` 是否等于当前元素来避免将相同的元素存储在哈希表中。

2. 时间优化:在遍历数组的我们可以检查哈希表中是否存在与当前元素相加等于目标值的另一个元素,这样可以减少遍历的次数。

总结

本文通过分析 LeetCode 的两数之和 II(有序数组)问题,详细解析了哈希表在解决两数之和问题中的应用。通过使用哈希表,我们可以将时间复杂度降低到 O(n),空间复杂度也保持在 O(n)。在实际应用中,我们可以根据具体问题对哈希表的使用进行优化,以达到更好的性能。