Leetcode力扣刷题记录与题解

1. 两数之和

给定一个整数数组 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]
python 复制代码
# 先用暴力破解法
class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        # 索引和元素都要
        # 从第一个元素开始逐个元素遍历
        for i,item in enumerate(nums):
            # 从第二个元素开始逐个取
            # 让按住的第一个元素,和第二个元素对比,看是否相等
            for j in range(i+1,len(nums)):
                post=nums[j]
                # 如果按住的那个和后面移动的那个  之和 等于 target说明找到了
                if item+post==target:
                    return [i,j]
# 只是速度太慢了

哈希表自带快速搜索功能,使用这个

python 复制代码
# 用哈希表
class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        # python里面哈希表就是字典
        # 哈希表有一个强行的规定,key不能重复
        cache={}

        # 先将数据存入哈希表中
        for i,item in enumerate(nums):
            # item作为key, i作为value
            cache[item] = i
        
        # 现在,去找与它之和等于target的那个元素
        # 遍历nums里面每一个元素
        for i,item in enumerate(nums):
            # 要找的东西是什么先给出来具体的值
            other=target-item
            # 如果这个要找的值在nums里面
            # 且这个被找到的数字的 索引index不等于  item的index i
            # 因为要把当前的元素排除出去。cache[other]==i 的元素都不会经过这里,把非当前元素保留
            if other in cache and cache[other]!=i:
                return[i,cache[other]]
        

对于后面这个例子输入:nums = 3,3, target = 6

输出:0,1,请问两个相同的元素3能放进同一个dict cache里面去吗?

**不能同时保留两个 3 的索引。**在 Python 字典中,键(key)必须是唯一的,后写入的相同键会直接覆盖前面的值。

具体分析 nums = [3, 3], target = 6 的情况

1. 建表阶段

当循环执行 cache[item] = i 时:

  • 第一次循环:i=0, item=3,字典变为 {3: 0}
  • 第二次循环:i=1, item=3,由于键 3 已存在,新值 1 会覆盖旧值 0 ,字典最终变为 {3: 1}

所以,第一个 3 的下标 0 在字典中已经丢失了。

2. 查找阶段

  • 当 i=0, item=3 时,计算 other = 6 - 3 = 3。
  • 检查 3 in cache → 成立。
  • 检查 cache[3] != i → 即 1 != 0 → 成立。
  • 返回 [0, 1],结果正确。

为什么这段代码依然能通过?

虽然字典里只保留了最后一个 3 的索引,但恰好够用 。因为题目保证只有一个答案,且不能用同一个元素两次。当遍历到第一个 3(i=0)时,字典里存的是第二个 3(i=1),cache[other] != i 这个判断保证了不会把同一个位置的元素用两次。

但这段代码其实有隐患

如果输入是 nums = [3, 3, 3], target = 6:

  • 建表后 cache = {3: 2}(只保留了最后一个索引)
  • 当 i=2, item=3 时,other=3,cache[3]=2,此时 cache[other] == i,条件不成立,会漏掉 [2, 1] 或 [2, 0] 这样的组合。

当然,题目说了"每种输入只会对应一个答案",所以这种情况不会出现。

更优的方式

python 复制代码
class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        cache = {}
        for i, item in enumerate(nums):
            other = target - item
            if other in cache:
                return [cache[other], i]
            cache[item] = i  # 当前元素放入字典,供后面的元素查找

举个例子模拟运行

假设 nums = [2, 7, 11, 15], target = 9。

第 1 轮循环 (i=0, item=2)

  • other = 9 - 2 = 7
  • 检查 7 in cache?此时 cache 是空的 {},所以 不在。
  • 执行 cache[2] = 0。现在 cache = {2: 0}。
  • (你看,这一轮没找到,但把 2 存进去了,方便后面的人找它)

第 2 轮循环 (i=1, item=7)

  • other = 9 - 7 = 2
  • 检查 2 in cache?此时 cache = {2: 0},在!
  • 既然在,说明之前已经遇到过 2 了。
  • 直接返回 [cache[2], 1],也就是 [0, 1]。

什么 cache[other] 能取出元素?

因为 other 是当前元素 需要的搭档。如果 other in cache 成立,说明这个搭档是之前的某次循环中已经被存进字典里的。

  • 当 item=7 时,它需要的搭档是 2。
  • 2 是在上一轮 (i=0) 被存进 cache 的。
  • 所以 cache[2] 能成功取出 0。
相关推荐
lzhdim7 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ10 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one12 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David12 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
lll235269177913 小时前
HR如何快速整理面试沟通内容?
面试·职场和发展
零售校长13 小时前
西湖区零售门店店长面试怎么准备
面试·职场和发展·零售
秋天的怀念_David13 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪13 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪13 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习