返回

想刷爆 LeetCode,来份两数之和最优解题法!

前端

导语:

踏入 LeetCode 刷题之旅,两数之和是绕不开的经典题目之一。解决两数之和的方法有很多,但如何选择最优解法,则是一门学问。本文将为您揭晓两数之和的最优解题法,带您领略算法的精妙之处。

一、题目概述:

给定一个数组 nums 和一个目标值 target,找出数组 nums 中的两个数,使得它们的和等于 target。要求不能重复利用数组中同样的元素。

二、最优解法:

为了快速找到两个加起来等于目标值的数,我们采用 Hash 表作为最优解法。Hash 表是一种数据结构,它可以将键值对存储为哈希表,以便快速查找和检索数据。

  1. 构建哈希表:

    • 首先,我们将数组 nums 中的每个数字作为键,其对应的下标作为值,构建一个哈希表。
  2. 遍历数组:

    • 然后,我们遍历数组 nums 中的每个数字。
  3. 查找目标值的补数:

    • 对于每个数字,我们计算出目标值 target 与其的补数,即 target - nums[i]
  4. 检查哈希表:

    • 我们检查哈希表中是否包含该补数。
  5. 找到目标数对:

    • 如果哈希表中包含该补数,则说明我们找到了目标数对。
  6. 更新哈希表:

    • 在每次查找补数之前,我们都将当前数字及其下标添加到哈希表中,以备后续查找之用。

三、代码示例:

def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    hash_table = {}  # 创建哈希表
    for i, num in enumerate(nums):  # 遍历数组
        complement = target - num  # 计算补数
        if complement in hash_table:  # 检查哈希表中是否包含补数
            return [hash_table[complement], i]  # 找到目标数对
        hash_table[num] = i  # 将当前数字及其下标添加到哈希表
    return None  # 未找到目标数对


# 测试用例
nums = [2, 7, 11, 15]
target = 9
result = twoSum(nums, target)
print(result)  # 输出结果:[0, 1]

四、算法分析:

使用哈希表作为最优解法,两数之和的时间复杂度为 O(n),其中 n 是数组 nums 的长度。这是因为我们只需要遍历数组一次,并在哈希表中查找补数。

结语:

通过本文的学习,您已经掌握了LeetCode经典题目「两数之和」的最优解题法,采用 Hash 表可以将时间复杂度降到 O(n)。希望本文能帮助您在 LeetCode 的刷题之旅中更上一层楼!