【简单】力扣算法题解析LeetCode1:两数之和

关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode1:两数之和


问题抽象: 给定一个整数数组 nums 和一个整数目标值 target,要求在数组中找出两个不同的元素,使得它们的和等于 target,并返回这两个元素的数组下标。核心需求如下:

  1. 唯一解存在性:假设输入数据中恰好存在一个有效解,且同一元素不可重复使用。
  2. 索引定位:需返回两个元素在数组中的索引值(通常以整数数组形式)。
  3. 无序性约束:数组元素顺序任意,解对应的索引顺序无要求(如返回 [i, j][j, i] 均可)。
  4. 高效查询:需避免暴力穷举,设计高效的查找策略(通常要求时间复杂度优于 O(n²))。

输入:整数数组 nums、整数 target
输出:包含两个索引值的数组(任意顺序)


解题思路

本题目要求在整数数组 nums 中找到两个数,使它们的和等于目标值 target,并返回这两个数的下标。核心思路是利用哈希表实现高效的补数查找:

  1. 问题分析
    暴力解法需要两层循环(时间复杂度 O(n²))。优化思路是空间换时间:通过哈希表存储已遍历元素的值与下标,实现 O(1) 复杂度的补数查找。

  2. 关键步骤

    • 补数计算:对于当前元素 nums[i],计算补数 complement = target - nums[i]
    • 哈希表查询:检查补数是否在哈希表中:
      • 若存在,直接返回 [补数的下标, 当前下标 i]
      • 若不存在,将 nums[i] 及其下标存入哈希表,供后续查询使用。
    • 提前终止:题目保证有解,找到匹配后立即返回结果。
  3. 复杂度分析时间复杂度:O(n),只需遍历数组一次。 空间复杂度:O(n),哈希表最多存储 n 个元素。


代码实现(Java版)🔥点击下载源码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 创建哈希表:键为元素值,值为元素下标
        HashMap<Integer, Integer> map = new HashMap<>(nums.length);
        for (int i = 0; i < nums.length; i++) {
            // 计算当前元素所需的补数
            int complement = target - nums[i];
            // 检查补数是否在哈希表中
            if (map.containsKey(complement)) {
                // 找到匹配:返回补数的下标和当前下标
                return new int[]{map.get(complement), i};
            }
            // 将当前元素及其下标存入哈希表
            map.put(nums[i], i);
        }
        // 题目保证有解,此句不会执行
        return new int[0];
    }
}

代码说明

  1. 初始化哈希表
    HashMap<Integer, Integer> map = new HashMap<>(nums.length) 指定初始容量为数组长度,避免扩容开销。

  2. 遍历与补数计算

    • 遍历数组时,计算 complement = target - nums[i](当前元素所需的补数)。
    • 若补数已存在于哈希表中(map.containsKey(complement)),说明找到了两个数,返回它们的下标:补数的下标(map.get(complement))和当前下标 i
  3. 哈希表更新
    若未找到补数,将当前元素 nums[i] 及其下标 i 存入哈希表,供后续查询使用。

  4. 终止条件

    • 题目保证有唯一解,因此循环内必会返回结果。
    • 循环外的 return new int[0] 仅为语法需要,实际不会执行。

示例演示: 以 nums = [2, 7, 11, 15], target = 9 为例:

  • i=0:补数 9-2=7 不在哈希表 → 存入 (2,0)
  • i=1:补数 9-7=2 在哈希表中 → 返回 [0,1]

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

达文汐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值