【LeetCode1】两数之和

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

思路与算法

  1. 暴力解法:使用两层循环枚举所有可能的数对,时间复杂度为 O(n²)。
  2. 优化思路:利用哈希表记录已经遍历过的数字,从而在一次遍历中实现查找,降低时间复杂度到 O(n)。
    题目中说明“每种输入只会对应一个答案”,这意味着对于每个元素,其唯一的补数只会出现一次。因此可以在遍历过程中将已经访问过的元素存储起来,以便后续快速判断。
    哈希表提供了平均 O(1) 的查找时间,可以在一次遍历中快速查找某个数。
    使用哈希表可以直接记录每个数字对应的下标,当我们遍历到一个数,若其补数已经出现,我们也可以返回两数的下标。

代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        #  使用哈希表(字典)记录已经遍历过的数字及其下标,格式为 {数值: 下标}
        seen = {}

        # 遍历数组,枚举当前数字和其下标
        for i, num in enumerate(nums):
            # 对于每个数字 num,计算其补数 complement = target - num
            complement = target - num
            if complement in seen:
                return [seen[complement], i]
            # 否则,将当前数字及其下标存入字典,继续遍历
            seen[num] = i
        
        # 根据题目要求,输入数据总能找到唯一解,因此不会执行到此处
        return []

总结

  1. 哈希表查找:利用哈希表(字典)的 O(1) 查找特性,能够快速确定某个值是否已经出现过。
  2. 通过在遍历过程中边查找边存储数据,可以将原本的双重循环优化为一次循环,显著降低时间复杂度。
  3. 在数据规模适中的情况下,使用 O(n) 的额外空间换取 O(n) 的时间复杂度是一个很常见且合理的权衡。
  4. 哈希表查找非常适合用来“寻找补数”,本题就是一个模板。
  5. enumerate 是 Python 内置的一个函数,用于在遍历可迭代对象(如列表、元组、字符串等)时,同时获取元素的索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值