返回

勇者无畏,新手入门 Leetcode:两数之和初探【简单题】

闲谈

【破题关键】

“两数之和”顾名思义,就是在一个整数数组中找到两个数字,其和等于一个给定的目标值。乍一看,这似乎是一道简单的数学题,但当数组规模庞大时,如何高效地找到这两个数字就成了关键。暴力解法虽然直观,但时间复杂度为 O(n^2),效率低下。因此,我们需要寻找更优的解决方案。

【算法详解】

为了提高效率,我们可以采用哈希表(散列表)来解决这个问题。哈希表是一种数据结构,它可以将键值对存储起来,并允许我们通过键快速查找对应的值。

  1. 构建哈希表:

    • 遍历数组中的每一个元素 num
    • 计算目标值与 num 的差值 target - num
    • target - num 作为键,num 作为值,插入到哈希表中。
  2. 查找和输出结果:

    • 再次遍历数组中的每一个元素 num
    • 计算目标值与 num 的差值 target - num
    • 检查哈希表中是否存在 target - num 这个键。
    • 如果存在,则说明找到了两个和为目标值的数字,输出这两个数字。

【代码实现】

def two_sum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    hashtable = dict()

    for i, num in enumerate(nums):
        complement = target - num
        if complement in hashtable:
            return [hashtable[complement], i]
        hashtable[num] = i

    return None

【复杂度分析】

  • 时间复杂度:O(n),其中 n 为数组的长度。
  • 空间复杂度:O(n),哈希表中最多存储 n 个键值对。

【扩展思考】

  • 如果数组中存在重复元素,该算法还能正常工作吗?
  • 如果目标值很大,如何避免哈希表的碰撞?
  • 除了哈希表,还有哪些数据结构可以用来解决这个问题?

【结语】

“两数之和”是 Leetcode 上一道经典的入门级题目。通过这道题,我们学习了如何利用哈希表来提高算法的效率。在后续的 Leetcode 挑战中,我们将继续探索更多有趣且具有挑战性的算法问题。让我们一起努力,在算法的海洋中乘风破浪,不断提升自己的编程能力!