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

【LeetCode 热题 100】1. 两数之和——(解法二)哈希表

Problem: 1. 两数之和

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N)
    • 空间复杂度:O(N)

整体思路

这段代码旨在高效地解决 “两数之和” 问题。与 O(N^2) 的暴力枚举法相比,此版本采用了一种经典的 “空间换时间” 策略,利用 哈希表 (HashMap) 将时间复杂度优化到了线性级别 O(N)。

该算法的核心思想是,在遍历数组的同时,利用哈希表快速查找每个数字所需的“另一半”。

算法的逻辑步骤可以分解如下:

  1. 数据结构选择

    • 算法选择 HashMap 作为核心数据结构。这个哈希表将用于存储已经遍历过的数字及其对应的索引,即 (数字 -> 索引) 的键值对。
    • 目的:哈希表提供了平均时间复杂度为 O(1) 的查找操作。这使得我们能够即时地回答“我们之前是否见过某个数字?”这个问题。
  2. 单次遍历与查找

    • 算法只需对 nums 数组进行一次 for 循环遍历。
    • 在循环的每一步(对于当前数字 nums[i]),算法执行两个核心操作,且顺序非常关键:
      a. 计算并查找“补数”:首先,计算出要与 nums[i] 相加才能得到 target 的那个“补数” other,即 other = target - nums[i]。然后,算法立即在哈希表中检查是否存在这个 other
      b. 处理查找结果
      • 如果找到了 (map.containsKey(other)):这意味着 other 这个数字在数组的前面部分(0i-1 的索引中)已经出现过。我们已经找到了解!此时,直接返回 other 的索引(从哈希表中获取 map.get(other))和当前数字的索引 i
      • 如果没有找到:这意味着在已经遍历过的数字中,没有 nums[i] 的“另一半”。那么,nums[i] 本身可能就是未来某个数字的“另一半”。因此,算法将当前数字 nums[i] 及其索引 i 存入哈希表中,以供后续的迭代查找。
  3. 返回结果

    • 由于题目保证有且仅有一个解,if 条件一定会在某个时刻被满足并返回结果。因此,理论上最后的 return null; 是不可达的(但在语法上是必需的,以防编译器报错)。

通过这种“边遍历边记录”的方式,算法将寻找配对数的过程从 O(N) 的线性扫描缩短为 O(1) 的哈希查找,从而实现了整体性能的飞跃。

完整代码

import java.util.HashMap;
import java.util.Map;class Solution {/*** 在数组中找出和为目标值的两个数的索引。* @param nums 整数数组* @param target 目标和* @return 包含两个索引的数组,如果不存在则返回 null*/public int[] twoSum(int[] nums, int target) {int n = nums.length;// map: 用于存储已遍历过的数字及其索引。// Key: 数组中的数字// Value: 该数字对应的索引Map<Integer, Integer> map = new HashMap<>();// 单次遍历数组for (int i = 0; i < n; i++) {// 计算当前数字 nums[i] 需要配对的“另一半”int other = target - nums[i];// 关键步骤:检查“另一半”是否已经存在于哈希表中// 这是 O(1) 的高效查找操作if (map.containsKey(other)) {// 如果存在,说明我们找到了解。// map.get(other) 是“另一半”的索引,i 是当前数字的索引。return new int[]{map.get(other), i};}// 如果“另一半”不存在,则将当前数字和它的索引存入哈希表,// 以便后续的元素可以查找它作为配对。map.put(nums[i], i);}// 根据题目假设,总会有一个解,所以理论上不会执行到这里。return null;}
}

时空复杂度

时间复杂度:O(N)

  1. 循环:算法的核心是一个 for 循环,它严格地遍历 nums 数组一次。如果数组的长度为 N,这个循环将执行 N 次。
  2. 循环内部操作
    • 在循环的每一次迭代中,执行的主要操作是 map.containsKey()map.put()
    • 对于 HashMap,这两个操作的平均时间复杂度都是 O(1)
    • 其余的算术和赋值操作也是 O(1)。

综合分析
算法由 N 次 O(1) 的操作组成。因此,总的时间复杂度是 N * O(1) = O(N)

空间复杂度:O(N)

  1. 主要存储开销:算法使用了一个哈希表 map 来存储已经遍历过的数字和它们的索引。
  2. 空间大小:在最坏的情况下(例如,解在数组的最后两个元素,或者无解),哈希表需要存储 N-1N 个键值对。因此,哈希表占用的空间与输入数组 nums 的大小 N 成线性关系。

综合分析
算法所需的额外空间主要由哈希表 map 决定。因此,其空间复杂度为 O(N)


文章转载自:

http://5Wter6dA.wjhdn.cn
http://wjLi0Hx5.wjhdn.cn
http://5Mz2QQDi.wjhdn.cn
http://ARixfiJy.wjhdn.cn
http://GthP3hng.wjhdn.cn
http://hMqcQjoX.wjhdn.cn
http://7HTkyZqc.wjhdn.cn
http://Lj67FyCh.wjhdn.cn
http://QipjDA7I.wjhdn.cn
http://3GQUmZAI.wjhdn.cn
http://ZUlU1hJL.wjhdn.cn
http://qr8I3RU0.wjhdn.cn
http://ATz8KJoV.wjhdn.cn
http://hO8fzFkI.wjhdn.cn
http://3s0r8QHg.wjhdn.cn
http://ZOtQVZ35.wjhdn.cn
http://Za3QSaRR.wjhdn.cn
http://4Y4xJa7e.wjhdn.cn
http://THYInkF8.wjhdn.cn
http://Hge9Zf59.wjhdn.cn
http://Tu2vYbyT.wjhdn.cn
http://3BKuNJTx.wjhdn.cn
http://ctjLyQhp.wjhdn.cn
http://0SdazOMJ.wjhdn.cn
http://Z3OheWTm.wjhdn.cn
http://qRY0PFHO.wjhdn.cn
http://AHEw9K3d.wjhdn.cn
http://6lTeLTUT.wjhdn.cn
http://k3BUvW8g.wjhdn.cn
http://sIyFOZ7r.wjhdn.cn
http://www.dtcms.com/a/367957.html

相关文章:

  • ansible阶段练习题
  • Vue用户管理系统代码逐行详解
  • 计算机网络4 第四章 网络层——网络间的通信问题(省际之间如何规划信件运输路线)
  • 【开题答辩全过程】以 基于Android的点餐系统为例,包含答辩的问题和答案
  • 突破材料极限!这种二维超晶格膜,能抗 1800K 极端热冲击​ | 乐研试剂
  • .tsx父页面给.vue子页面传参
  • DPO算法
  • Photoshop图层
  • flutter-使用fluttertoast制作丰富的高颜值toast
  • 数据无言,网关有声 耐达讯自动化RS485转Profinet让千年液位数据“开口说话”
  • 如何将联系人从 iPhone 转移到 Redmi 手机
  • 从 ETL 到 Agentic AI:工业数据管理变革与 TDengine IDMP 的治理之道
  • PostgreSQL15——DML 语句
  • 机器学习-决策树(下)
  • 如何将视频从 iPhone 转移到 Mac
  • 基于Echarts+HTML5可视化数据大屏展示-旅游智慧中心
  • AI API Tester体验:API测试工具如何高效生成接口测试用例、覆盖异常场景?
  • 四六级学习资料管理系统的设计与实现(代码+数据库+LW)
  • (3)Seata AT 模式的事务一致性保证机制
  • MySQL主从同步--主从复制进阶
  • VisionMaster 4.2.0安装
  • FastVLM-0.5B 模型解析
  • 球坐标系下调和函数的构造:多项式边界条件的求解方法
  • 基于SpringBoot的旅游管理系统的设计与实现(代码+数据库+LW)
  • 【面试】框架常见面试(追问)
  • Android/Java 中接口(Interface)的使用场景、用途和方法
  • android 读取cpu+m1类型的nfc卡片,设置只读写m1的内容
  • 扫描件、PDF、图片都能比对!让文档差异无所遁形
  • 【FastDDS】Discovery ( 05-Discovery Server Settings)
  • 嵌入式第四十六天(51单片机(通信))