📜  门| GATE CS 2021 |设置 2 |第 36 题(1)

📅  最后修改于: 2023-12-03 15:28:38.948000             🧑  作者: Mango

GATE CS 2021 | 设置 2 | 第 36 题

本题是 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 命令进行单元测试。