【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://www.pswp.cn/news/921320.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL主从同步--主从复制进阶

MySQL支持一台主库同时向多台从库进行复制&#xff0c;从库同时也可以作为其他从服务器的主库&#xff0c;实现链状复制。1、MySQL支持的binlog二进制日志复制类型- 基于语句&#xff08;statement&#xff09;的复制在主服务器上执行SQL语句&#xff0c;在从服务器上执行同样的…

WPF外部打开html文件

注意&#xff1a;这是一份提供WPF外部浏览器打开html的方法&#xff0c;而不是WPF内部嵌入html 需要通过浏览器打开&#xff0c;否则无法使用地址栏拼接参数的形式操作html 下面是打开html的方法↓string localHtmlPath "C:\Users\pangb\Downloads\Help\帮助文档 - 副本.…

Go初级之十:错误处理与程序健壮性

Go初级之十&#xff1a;错误处理与程序健壮性为什么选这个主题&#xff1f; 错误处理是 Go 语言中一个非常独特且重要的设计哲学。它体现了 Go 的“显式错误处理”思想&#xff0c;与其它语言&#xff08;如 Java/Python&#xff09;的异常机制不同。在实际开发中&#xff0c;几…

Xsens解码人形机器人训练的语言

随着人形机器人在现实世界的应用中变得越来越普遍&#xff0c;了解实现其类似人类运动的技术至关重要。在Xsens我们满怀热情地探索这一领域&#xff0c;致力于为人形机器人训练开发最佳的动作捕捉解决方案。为了帮助您更好地理解所遇到的术语&#xff0c;我们创建了一份概述&am…

25年下载chromedriver.140

前提&#xff1a; 因为我需要用seleium模拟浏览器获取数据&#xff0c;需要用到这个chromedriver 驱动。 1.chrome浏览器版本号 先检查你的chrome 的版本号是多少&#xff0c;就下载对应的 chromedriver 【三个点】--->【帮助】------>【关于 Google chrome 】 我的版本…

深度学习玩游戏, 模型玩游戏,大模型+游戏 llm+game, 机器学习玩游戏,人工智能游戏陪伴,模型陪玩游戏

1. 论文地址 Think in Games: Learning to Reason in Games via Reinforcement Learning with Large Language Models 2. 中文&#xff1a; Think in Games&#xff1a;做一个在王者荣耀中会玩和思考的Agent 3. 我记得几年前&#xff0c;相关文章还是使用dqn算法。玩雅利达小…

并查集|栈

lc1668不能直接跳class Solution { public:int maxRepeating(string sequence, string word) {int k 0, n sequence.size(), wn word.size(), t 0;for (int i 0; i < n - wn; i) {if (sequence.substr(i, wn) word) {t 1;int j i wn;while (j wn < n &&…

问题三ai思路

好的&#xff0c;我把“路线A&#xff1a;分类建模择时”的代码按功能分段给出&#xff0c;并为每段配上简明解释。你可以将这些段落依次粘贴到已完成清洗后的 df 变量之后直接运行。 0. 依赖导入&#xff08;一次即可&#xff09; 作用&#xff1a;导入所需库&#xff1b;后续…

Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦

集合1 Collection接口1.1 集合概述集合是一个装对象的容器。集合中只能存放引用数据类型的对象。集合中有一些大小是固定的&#xff0c;有一些是不固定的。有一些是有序的&#xff0c;有些是无序的。有些可以有重复元素&#xff0c;有一些不可以有重复元素1.2 集合常用方法publ…

硬件基础:串口通信

数据传输方式&#xff08;按位传输方式&#xff09;并行通信通过多条数据线同时传输多个数据位&#xff0c;速度较快但成本高&#xff0c;抗干扰能力弱&#xff0c;适用于短距离通信&#xff0c;如早期的打印机接口。串行通信通过单条或少数数据线逐位传输数据&#xff0c;线路…

从Java全栈到云原生:一场技术深度对话

从Java全栈到云原生&#xff1a;一场技术深度对话 面试官与应聘者互动记录 面试官&#xff1a;你好&#xff0c;欢迎来到我们的面试。先简单介绍一下你自己吧。 应聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;28岁&#xff0c;硕士学历&#xff0c;有5年Java全栈开发…

158-EEMD-HHT算法

158-EEMD-HHT#EMD #希尔伯特变换-&#xff08;Hilbert- Huang Transform&#xff0c;HHT&#xff09;#集合经验模态分解 EEMD #时频分析 #边际谱代码描述1、利用 集合经验模态分解&#xff08;EEMD&#xff09;方法对信号进行分解&#xff0c;得到模态分量 IMF&#xff1b;2、计…

C#开发中的 token

C# 开发中的 Token 详解 C# 开发中的 Token 详解与示例 1. CancellationToken - 异步取消令牌 示例 1:基础取消机制 示例 2:Web API 中的请求取消 2. JWT Token - 身份验证令牌 示例 1:JWT Token 生成与验证 示例 2:ASP.NET Core JWT 认证配置 3. Access Token - API 访问令…

旅游安全急救实训室助力应急处置技能实战化

随着旅游行业的快速发展&#xff0c;游客安全需求日益突出&#xff0c;应急处置能力已成为旅游服务人才的核心素养之一。在中职教育旅游服务与管理专业中&#xff0c;旅游安全急救实训室作为关键教学场所&#xff0c;正发挥着不可替代的作用。一、旅游安全急救实训室的建设背景…

分布式微服务--ZooKeeper的客户端常用命令 Java API 操作

一、ZooKeeper 客户端常用命令 1. 启动与退出 bin/zkCli.sh -server 127.0.0.1:2181 # 连接客户端 quit # 退出客户端2. 节点操作 # 查看子节点 ls / ls -s / ls /app# 查看节点详细信息 ls2 /app stat /app# 创建节点 create /node1 "…

PID控制技术深度剖析:从基础原理到高级应用(六)

PID 控制技术深度剖析&#xff1a;从基础原理到高级应用 最近在项目中有要开始进行PID的控制了&#xff0c;隔了很久没有做PID控制的东西了&#xff0c;所以想正好借这个机会&#xff0c;温习一下和PID有关的内容。 系列文章目录 PID控制技术深度剖析&#xff1a;从基础原理到…

PCL关键点提取

1. 核心概念:什么是关键点?为什么需要关键点? 关键词:信息冗余、计算效率、突出特征 “想象一下,我们有一片密集的点云,包含几十万个点。如果我们直接在每个点上都计算像FPFH这样的局部特征,计算量会非常大,极其耗时,而且很多点所处的区域(比如平坦的墙面)特征非常…

vcruntime140_1.dll缺失怎么办?暗黑破坏神游戏vcruntime140_1.dll缺失的4个解决方法

你是否遇到过这样的情况&#xff1a; 玩《暗黑破坏神》《英雄联盟》《GTA5》的时候&#xff0c;游戏忽然闪退&#xff0c;弹窗提示&#xff1a; “无法启动&#xff0c;因为计算机中丢失 vcruntime140_1.dll” 这不是某一个游戏的问题&#xff0c;而是 Windows 系统运行库缺失…

迁移学习-ResNet

好的&#xff0c;我将为你撰写一篇关于ResNet迁移学习的技术博客。以下是博客的主要内容&#xff1a;ResNet迁移学习&#xff1a;原理、实践与效果深度解析1. 深度学习中迁移学习的重要性与ResNet的独特价值迁移学习&#xff08;Transfer Learning&#xff09;是机器学习中一种…

极大似然估计与概率图模型:统计建模的黄金组合

在数据驱动的时代&#xff0c;如何从海量信息中提取有价值的规律&#xff1f;统计建模提供了两大核心工具&#xff1a;极大似然估计&#xff08;MLE&#xff09;帮助我们根据数据推断模型参数&#xff0c;而概率图模型&#xff08;PGM&#xff09;则通过图形化语言描述变量间的…