Leetcode|1. 两数之和【笔记】
发布日期:2021-05-24 01:21:24 浏览次数:40 分类:精选文章

本文共 1461 字,大约阅读时间需要 4 分钟。

两数之和

题目

给定一个整数数组 nums 和一个整数 target,请你在该数组中找出和为 target 的那两个整数,并返回它们的数组下标。同一个元素不能使用两遍。你可以按任意顺序返回答案。

示例

  • 示例1:

    • 输入:nums = [2, 7, 11, 15], target = 9
    • 输出:[0, 1]
  • 示例2:

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

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

思路

方法一:两层循环

  • 初步想法:寻找两个数,它们的和等于目标值。这让我想到可以使用两层循环分别遍历所有可能的数对。

  • 实现步骤

    • 外层循环遍历数组中的每一个整数作为第一个数,索引为 i
    • 内层循环遍历数组中的每一个整数作为第二个数,索引为 j,且 j 必须大于 i(确保不重复)。
    • 检查两个数的和是否等于目标值。如果相等,将这两个数的索引存储起来返回。
  • 优点:简单易懂,代码实现容易,时间复杂度为 O(n²),适用于小量数据的情况。

  • 方法二:字典(哈希表)

  • 初步想法:为了提高效率,我们可以使用哈希表来存储数值及其对应的索引,这样可以在 O(1) 时间内查找是否存在对应的值。

  • 实现步骤

    • 初始化一个空字典。
    • 遍历数组中的每一个数。
    • 对于每个数 num,计算 target - num,检查字典中是否存在这个值作为键。
    • 如果存在,说明找到两个数,一个是 num,另一个是字典中对应值的数,返回它们的索引。
    • 如果不存在,将当前数作为键,值为索引存入字典。
  • 优点:时间复杂度为 O(n),非常高效,适用于大量数据。字典的查询速度快,使得整体代码更高效。

  • 代码实现

    方法一: 两层循环

    class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
    n = len(nums)
    s = [0, 1] # 结果数组,存储两个索引
    for i in range(n):
    for j in range(i + 1, n):
    if nums[i] + nums[j] == target:
    s[0], s[1] = i, j
    return s
    return [] # 如果没有找到

    方法二: 字典实现

    class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
    h = {}
    for i, num in enumerate(nums):
    complement = target - num
    if complement in h:
    return [h[complement], i]
    h[num] = i
    return [] # 如果没有找到

    总结

    两种方法各有优劣。两层循环简单直观,适合小数组;哈希表法高效,适合大数据量。无论采用哪种方法,核心目标都是高效地找到两个数,使其和等于目标值。

    上一篇:Leetcode|70. 爬楼梯【笔记】
    下一篇:Leetcode|136. 只出现一次的数字【笔记】

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月26日 17时33分27秒