1.两数之和 python

题目描述

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

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

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

示例1

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例2

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例3

输入:nums = [3,3], target = 6
输出:[0,1]

提示

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

leetcode链接

https://leetcode.cn/problems/two-sum/description

可以通过哈希表来高效地解决。具体思路如下:

解题思路

  1. 使用哈希表

    • 创建一个哈希表,用于存储数组中每个元素的值和对应的索引。
    • 遍历数组,对于每个元素 nums[i],检查哈希表中是否存在 target - nums[i]
    • 如果存在,说明找到了两个数,返回它们的索引。
    • 如果不存在,将当前元素 nums[i] 和它的索引 i 存入哈希表中。
  2. 时间复杂度

    • 由于只遍历一次数组,时间复杂度为 (O(n))。
    • 哈希表的查找和插入操作平均时间复杂度为 (O(1))。
  3. 空间复杂度

    • 哈希表的空间复杂度为 (O(n)),因为最坏情况下需要存储所有元素。

Python 实现

def twoSum(nums: List[int], target: int) -> List[int]:
    # 创建一个哈希表
    hash_map = {}
    
    # 遍历数组
    for i, num in enumerate(nums):
        # 计算目标值与当前元素的差值
        complement = target - num
        
        # 检查哈希表中是否存在差值
        if complement in hash_map:
            # 如果存在,返回当前元素的索引和差值的索引
            return [hash_map[complement], i]
        
        # 如果不存在,将当前元素和它的索引存入哈希表
        hash_map[num] = i

详细解释

  1. 初始化哈希表

    • hash_map = {}:创建一个空的字典,用于存储数组中的元素及其索引。
  2. 遍历数组

    • for i, num in enumerate(nums):使用 enumerate 遍历数组,同时获取每个元素的索引 i 和值 num
  3. 计算差值

    • complement = target - num:计算目标值 target 与当前元素 num 的差值 complement
  4. 检查哈希表

    • if complement in hash_map:检查哈希表中是否存在 complement
    • return [hash_map[complement], i]:如果存在,返回 complement 的索引和当前元素的索引 i
  5. 更新哈希表

    • hash_map[num] = i:如果 complement 不存在,将当前元素 num 和它的索引 i 存入哈希表中。

通过这种方法,我们可以在一次遍历中找到两个数的索引,时间复杂度为 (O(n)),空间复杂度为 (O(n))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值