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

【HOT100|1 LeetCode 1. 两数之和】

这段代码是解决「LeetCode 1. 两数之和」问题的经典哈希表解法,核心思路是通过哈希表记录已遍历元素的索引,实现快速查找 “互补元素”,从而将时间复杂度优化到线性级别。下面从「问题理解→核心思路→代码逐行解析→实例演示」四个维度详细讲解:

一、问题理解

「两数之和」问题要求:给定一个整数数组 nums 和一个目标值 target,在数组中找到两个不同的元素,使它们的和等于 target,返回这两个元素的索引(注意:索引从 0 开始,且第一个索引必须小于第二个索引)。题目保证:数组中一定存在唯一解(无需考虑无解情况)。

二、核心思路

暴力解法(两层循环遍历所有可能的两数组合)的时间复杂度是 O(n²),效率较低。而哈希表解法的核心优化是:用哈希表记录「已遍历元素的值→索引」,对于当前遍历的元素 x,只需检查哈希表中是否存在 target - x(即 “互补元素”):

  • 若存在:说明这两个元素的和为 target,直接返回它们的索引(哈希表中记录的索引是之前的,当前索引是后遍历的,满足 “前小后大”)。
  • 若不存在:将当前元素 x 和其索引存入哈希表,继续遍历。

三、代码逐行解析

java

运行

class Solution {public int[] twoSum(int[] nums, int target) {// 1. 创建哈希表:key是数组元素的值,value是该元素的索引Map<Integer, Integer> idx = new HashMap<>();// 2. 遍历数组(j是当前元素的索引)// 循环没有终止条件:因为题目保证有唯一解,一定会在找到时返回for (int j = 0;; j++) {// 2.1 取当前元素的值xint x = nums[j];// 2.2 检查哈希表中是否存在“互补元素”(target - x)if (idx.containsKey(target - x)) {// 若存在:返回互补元素的索引(哈希表中存储的)和当前索引jreturn new int[]{idx.get(target - x), j};}// 2.3 若不存在:将当前元素x和其索引j存入哈希表,继续遍历idx.put(x, j);}}
}
关键细节拆解:
  1. 哈希表的作用Map<Integer, Integer> idx = new HashMap<>():哈希表的键(key)是数组中已经遍历过的元素值,值(value)是该元素对应的索引。这样可以通过 containsKey 方法O (1) 时间判断 “互补元素” 是否存在,通过 get 方法O (1) 时间获取其索引。

  2. 循环设计for (int j = 0;; j++)

    • 循环变量 j 是当前遍历元素的索引,从 0 开始递增。
    • 没有终止条件(;;):因为题目明确 “一定有解”,所以循环会在找到符合条件的两个元素时通过 return 终止,不会无限循环。
  3. 核心逻辑:查找互补元素

    • int x = nums[j]:当前遍历的元素值为 x
    • target - x:需要寻找的 “互补元素”(两者之和为 target)。
    • idx.containsKey(target - x):检查哈希表中是否存在之前遍历过的 “互补元素”。
      • 若存在:idx.get(target - x) 得到互补元素的索引(必然小于 j,因为它是之前遍历的),直接返回这两个索引。
      • 若不存在:idx.put(x, j) 将当前元素和索引存入哈希表,继续遍历下一个元素。

四、实例演示

以经典测试用例 nums = [2, 7, 11, 15],target = 9 为例,演示执行过程:

  1. 初始状态:哈希表 idx 为空,j = 0
  2. j=0
    • x = nums[0] = 2
    • 检查是否有 target - x = 9 - 2 = 7?哈希表为空,无。
    • 存入 idx.put(2, 0) → 哈希表:{2:0}
  3. j=1
    • x = nums[1] = 7
    • 检查是否有 target - x = 9 - 7 = 2?哈希表中存在 2,对应索引 0
    • 满足条件,返回 new int[]{0, 1} → 结果正确。

五、复杂度分析

  • 时间复杂度O(n)只需遍历一次数组(n 是数组长度),哈希表的 containsKey 和 put 操作均为 O(1) 平均时间复杂度。
  • 空间复杂度O(n)最坏情况下,需要在哈希表中存储 n-1 个元素(找到解时的前一个元素)。

总结

该解法的核心是利用哈希表的快速查找特性,将 “查找互补元素” 的时间从暴力解法的 O(n) 优化到 O(1),整体效率大幅提升。这种 “以空间换时间” 的思路是哈希表的典型应用,也是大厂面试中高频考察的基础算法思想。

http://www.dtcms.com/a/577806.html

相关文章:

  • 中专服装设计专业职业发展指南
  • RHCE练习
  • 旅行社网站建设规划书论文网站开发需要多钱
  • 云南抖音推广南昌快速优化排名
  • 【GESP2509四级】排兵布阵
  • 矩阵的运算
  • linux TCP
  • 专业做网站报价安徽网站建设系统
  • 网站建设对产品推销作用大吗wordpress主题购物
  • 基于SpringMVC的在线文档管理系统3yy4cg58(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Qt中使用系统级全局热键
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十八)监控模块--Zabbix监控--Rocky9基于MySQL安装Zabbix7
  • pc微信ccd 3.55算法。
  • DeepSpeed 分布式训练
  • 昭和仙君(五十七)标签票据模板渲染技术——东方仙盟筑基期
  • QScrollArea技术详解:构建流畅滚动体验
  • 基础数据结构之链表的反转链表:反转整个链表(leecode 206题 简单题)
  • 广东省网站集约化建设方案建设网站需要哪个软件
  • 网站开发技术视频教程wordpress添加菜单分类目录是灰的
  • 一种双重形式化表征方法:为人工智能与人类智慧的协同进化提供了全新的方法论基础
  • ETCD 权限配置
  • 数据结构(c++版):深入理解哈希表
  • HIKVISION前端一面面经整理
  • Rocky9基于MySQL安装Zabbix7
  • 安庆网站制作1688阿里巴巴国际站首页
  • 阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态
  • 太原网站建设内蒙古建设工程造价信息网官网中项网
  • Oracle 19C RAC下TRUNCATE TABLE的REUSE STORAGE选项作用和风险浅析!
  • CentOS 7 Oracle 11g RAC+DataGuard 分阶段静默部署脚本
  • 索牛网站建设江苏省建设厅官网网站首页