数据结构与算法之 leetcode 哈希表两数之和 III 有序数组双指针

数据结构与算法阿木 发布于 3 天前 3 次阅读


哈希表两数之和 III:有序数组双指针的巧妙应用

在LeetCode中,两数之和问题是一个经典且常见的题目。它要求我们找出数组中两个数,使得它们的和等于一个特定的目标值。这个问题有多种解法,其中之一是使用哈希表。本文将探讨一种基于有序数组的双指针方法来解决两数之和 III 问题,并分析其时间复杂度和空间复杂度。

问题分析

给定一个整数数组 `nums` 和一个目标值 `target`,找出数组中两个数,使得它们的和等于 `target`。返回这两个数的索引。你可以假设每个输入只对应一个答案,且你不可能重复使用相同的元素。

示例:


输入:nums = [2, 7, 11, 15], target = 9


输出:[0, 1]


解释:因为 nums[0] + nums[1] = 2 + 7 = 9 ,返回 [0, 1] 。


解法思路

由于题目要求返回两个数的索引,我们可以考虑使用双指针方法。我们将数组排序,然后使用两个指针分别指向数组的开始和结束位置。根据两个指针所指向的数的和与目标值的关系,我们可以决定如何移动指针。

1. 如果两个数的和小于目标值,我们将左指针向右移动,增加和。

2. 如果两个数的和大于目标值,我们将右指针向左移动,减少和。

3. 如果两个数的和等于目标值,我们找到了答案,返回两个指针的索引。

为了实现这个方法,我们需要在移动指针之前检查当前的和是否已经存在于一个哈希表中。如果存在,我们可以直接返回当前的和以及哈希表中对应的索引。如果不存在,我们将当前的和添加到哈希表中。

代码实现

下面是使用双指针和哈希表解决两数之和 III 问题的代码实现:

python

def twoSum(nums, target):


nums.sort() 对数组进行排序


left, right = 0, len(nums) - 1


hash_set = set() 创建一个哈希表

while left < right:


current_sum = nums[left] + nums[right]


if current_sum == target:


return [left, right]


elif current_sum < target:


hash_set.add(nums[left])


left += 1


else:


right -= 1

return [] 如果没有找到答案,返回空列表

测试代码


nums = [2, 7, 11, 15]


target = 9


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


时间复杂度和空间复杂度分析

- 时间复杂度:排序的时间复杂度为 O(n log n),双指针遍历数组的时间复杂度为 O(n),因此总的时间复杂度为 O(n log n)。

- 空间复杂度:哈希表的空间复杂度为 O(n),因为最坏的情况下,所有元素都需要存储在哈希表中。

总结

本文介绍了使用双指针和哈希表解决两数之和 III 问题的方法。这种方法在有序数组中非常有效,因为它结合了排序和哈希表的优点。通过排序,我们可以使用双指针快速找到和为目标值的两个数;通过哈希表,我们可以快速检查和是否已经存在。这种方法在处理大数据集时尤其有用,因为它的时间复杂度较低。