📅  最后修改于: 2023-12-03 15:28:38.948000             🧑  作者: Mango
本题是 GATE CS 2021 年考试中的编程题,要求编写一个 Python 函数,完成给定任务。以下是题目描述和函数签名:
给定一个整数数组和一个目标值,编写一个函数来查找数组中是否存在两个数相加等于目标值。如果存在,返回两个数的索引(下标),其中第一个数的索引小于第二个数的索引。如果不存在这样的两个数,则返回 None
。
例如,给定数组 nums = [2, 7, 11, 15]
和目标值 target = 9
,因为 nums[0] + nums[1] = 2 + 7 = 9
,所以函数应该返回 (0, 1)
。
def two_sum(nums: List[int], target: int) -> Optional[Tuple[int, int]]:
函数接受两个参数:
nums
:一个整数数组,长度不超过 $10^4$。target
:一个整数,表示目标值。函数的返回值是一个元组,表示两个数的下标。如果不存在这样的两个数,则返回 None
。
assert two_sum([2, 7, 11, 15], 9) == (0, 1)
assert two_sum([3, 2, 4], 6) == (1, 2)
assert two_sum([3, 3], 6) == (0, 1)
assert two_sum([2, 7, 11, 15], 26) == (2, 3)
assert two_sum([2, 7, 11, 15], 13) is None
题目要求我们查找两个数的和是否等于给定的目标值。暴力解法是枚举每一对不同的数,并计算它们的和是否等于目标值。此时的时间复杂度为 $O(n^2)$,其中 $n$ 是数组的长度。当数据规模较小时,这种方法可以接受。但当 $n$ 较大时,时间复杂度将过高,不符合要求。
因此,我们需要考虑优化算法。一种较好的算法是使用哈希表,将已访问的元素及其索引存储在哈希表中。哈希表的访问时间为 $O(1)$,所以我们可以在常数时间内找到一个数字是否已经访问过,并且对于每个数字,我们只需要查询一次哈希表,因此总的时间复杂度为 $O(n)$。
算法的流程如下:
hash_map
。nums
,对于每个元素 num
:target - num
。num
作为键,当前索引作为值,存储在哈希表中。None
。以下是 Python 代码的实现:
from typing import List, Optional, Tuple
def two_sum(nums: List[int], target: int) -> Optional[Tuple[int, int]]:
hash_map = {}
for i, num in enumerate(nums):
if target - num in hash_map:
return (hash_map[target - num], i)
hash_map[num] = i
return None
测试用例已经在函数签名的文本中给出了,这里不再重复。测试用例覆盖了各种边界情况和一般情况。可以运行 python -m unittest
命令进行单元测试。