当前位置: 首页 > news >正文

LeetCode 热题100 - 1. 两数之和(Java 题解 )

LeetCode 热题100 - 1. 两数之和(Java 题解 )

题目链接

两数之和 - LeetCode

难度

简单

题目描述

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

注意:

  • 每种输入只会对应一个答案。
  • 数组中同一个元素在答案里不能重复出现。
  • 可以按任意顺序返回答案。

解题思路

本题最优解为「哈希表法」,核心思路是「空间换时间」,解决暴力解法效率低的问题,具体思路如下:

  1. 暴力解法分析:双重循环遍历所有数对,判断两数之和是否等于 target,时间复杂度 O(n²),对于大数据量效率极低,不推荐用于面试和实际提交。
  2. 哈希表优化逻辑:要找到两数之和为 target,等价于对数组中的每个元素 nums[i],寻找 target - nums[i](即补数)是否存在于数组中,且补数的下标不等于 i。
  3. 具体操作:使用 HashMap 存储已遍历过的元素,key 为元素值,value 为元素对应的下标,这样可以将「查找补数」的操作从 O(n) 优化到 O(1)。
  4. 遍历流程:遍历数组时,先计算当前元素的补数,判断补数是否在 HashMap 中;若存在,直接返回当前下标和补数的下标;若不存在,将当前元素和其下标存入 HashMap,继续遍历。

复杂度分析

  • 时间复杂度:O(n),仅遍历数组一次,每次 HashMap 的查找、插入操作均为 O(1)。
  • 空间复杂度:O(n),最坏情况下,需要将数组中所有元素存入 HashMap(即答案在数组末尾)。

解题代码(Java)

import java.util.HashMap;
import java.util.Map;public class Solution {public int[] twoSum(int[] nums, int target) {// 哈希表:key=数组元素值,value=元素对应的下标Map<Integer, Integer> map = new HashMap<>();int length = nums.length;// 遍历数组,一次完成查找和存入操作for (int i = 0; i < length; i++) {// 计算当前元素需要的补数(target - 当前元素)int sub = target - nums[i];// 判断补数是否已在哈希表中(已遍历过)if (map.containsKey(sub)) {// 存在则直接返回结果,顺序不影响题目要求return new int[]{i, map.get(sub)};}// 不存在则将当前元素和下标存入哈希表,供后续元素查找map.put(nums[i], i);}// 题目保证有唯一解,此处仅为满足语法完整性,不会执行到return null;}
}

代码解析

  1. HashMap 定义:Map<Integer, Integer> map = new HashMap<>(),专门用于缓存已遍历的元素和其下标,避免重复遍历。
  2. 补数计算:int sub = target - nums[i],这是本题的核心逻辑,将“两数之和”转化为“单个数查找补数”。
  3. 补数判断:map.containsKey(sub),快速判断补数是否存在,时间复杂度 O(1),这是哈希表优化的关键。
  4. 结果返回:找到补数后立即返回,无需继续遍历,提升代码执行效率;返回的下标顺序可颠倒,题目不做要求。
  5. 兜底返回:return null 仅为语法要求,题目明确每种输入有唯一解,遍历过程中一定会找到答案并返回。

示例演示

输入:nums = [2,7,11,15], target = 9

  1. i=0,nums[0]=2,sub=9-2=7,HashMap 为空,存入 (2, 0);
  2. i=1,nums[1]=7,sub=9-7=2,HashMap 包含 key=2,返回 [1, 0];
  3. 程序结束,输出结果 [1, 0](或 [0, 1] 均正确)。

易错点提醒

  • 不能先将当前元素存入 HashMap,再判断补数:否则会出现“自己和自己配对”的情况(如 nums = [3,2,4], target=6,若先存 3,再判断 sub=3,会误返回 [0,0])。
  • HashMap 的 key 存元素值、value 存下标:因为我们需要通过“补数(值)”查找对应的下标,而非通过下标查找值。
  • 无需考虑数组元素重复:题目明确“每种输入只会对应一个答案”,且“同一个元素不能重复出现”,因此重复元素不会影响结果。

总结

本题是 LeetCode 入门题,核心考察「哈希表的应用」和「空间换时间」的优化思想。暴力解法虽能通过简单用例,但面试中更看重最优解(哈希表法),其 O(n) 的时间复杂度和简洁的代码,也是 Java 面试中常见的基础考点。

持续更新 LeetCode 热题100 题解(Java 版本),专注面试向,欢迎收藏关注~

http://www.jsqmd.com/news/628391/

相关文章:

  • 【renpy教程】在screens.rpy添加一个文本标签跳转到指定的剧情标签
  • OpenCore Configurator:黑苹果终极配置工具完全指南
  • 洛雪音乐助手:3步快速上手的免费开源音乐播放器
  • memtest_vulkan:终极GPU显存稳定性测试指南,快速诊断显卡硬件问题
  • Spring Boot 3.4.3整合Ollama实战:7B大模型对话系统开发避坑指南
  • GME-Qwen2-VL-2B-Instruct系统管理:Linux服务器C盘(根目录)空间清理与模型数据管理
  • 低电压Bandgap设计全攻略:如何在0.75V供电下实现稳定基准
  • 聊聊河北廊坊博大单招学校,费用多少且靠谱吗 - 工业推荐榜
  • 从零到一:Amesim与Simulink联合仿真环境搭建的避坑指南与实践验证
  • 2026年山西饲料厂家第一梯队排名,哪家性价比更高 - 工业品网
  • Vue3 + SpringBoot实战:用Minio搞定大文件切片上传与断点续传(附完整前后端代码)
  • 3步完成iOS 15-16设备激活锁绕过的终极指南
  • 头歌C语言实验高效解题指南:从结构体到实战应用
  • Qwen3-VL-8B快速入门指南:一键部署,让AI看懂你的图片并回答问题
  • 车载测试面试通关秘籍:从CANoe配置到Python脚本实战(附高频问题解析)
  • 总结做产业园展馆设计施工的企业,北京口碑好的推荐哪家? - 工业设备
  • 深入解析QLibrary:动态库加载与跨平台函数调用的实战技巧
  • 终极指南:如何使用BOTW存档编辑器轻松定制你的海拉鲁冒险
  • 深入解析RF与IR遥控技术:从240MHz到蓝牙的全面对比
  • [具身智能-351]:类似一个公司组织系统,MCP Client是管理者,是总经理,是协调者;大模型服务是一个:决策者,是智囊团,是董事会;MCP Server是执行者,是服务提供者。
  • 如何高效下载网页视频:VideoDownloadHelper完整使用指南
  • 飞腾D2000开发板实战:手把手教你配置U-Boot网络启动与USB设备树加载
  • 阶跃星辰STEP3-VL-10B实战入门:LangChain MultiModalRouter集成STEP3-VL-10B路由策略
  • 别再只盯着NVMe了!聊聊企业级存储里SAS硬盘那些‘不起眼’但至关重要的设计细节
  • WarcraftHelper:让你的魔兽争霸3帧率飙升300%的开源优化神器
  • 聊聊男士真皮腰带加工厂哪家更值得选,品质与价格全分析 - 工业品牌热点
  • LocalVocal终极指南:如何打造零延迟的本地AI字幕系统?
  • RePKG深度指南:如何解锁Wallpaper Engine的PKG资源与TEX纹理转换
  • 别再死记硬背DAC0832时序了!用汇编语言深入理解51单片机如何‘指挥’它生成正弦波
  • Android日志查看终极指南:用Logcat Reader快速调试移动应用