java数据结构(哈希表—HashMap)含LeetCode例题讲解
目录
1、HashMap的基本方法
1.1、基础方法(增删改查)
1.2、其他方法
2、HashMap的相关例题
2.1、题目介绍
2.2、解题
2.2.1、解题思路
2.2.2、解题图解
2.3、解题代码
1、HashMap的基本方法
HashMap 是一个散列表,它存储的内容是键值(key-value)映射。
HashMap 的 key 与 value 类型可以相同也可以不同,根据定义,不受限制。
1.1、基础方法(增删改查)
1.定义一个哈希表
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
2.添加键值对(key-value)(增)
hashmap.put(1, "string1"); // 执行完后hash表内为{1=string1}
hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2}
hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2, 3=string3}
3.根据key值访问value(查)
hashmap.get(1); // 返回string1
hashmap.get(2); // 返回string2
hashmap.get(3); // 返回string3
4.根据key值删除元素(删)
hashmap.remove(1); // 执行完后hash表内为{2=string2, 3=string3}
hashmap.remove(2); // 执行完后hash表内为{3=string3}
hashmap.remove(3); // 执行完后hash表内为{}
// 删除所有键值对
hashmap.clear();
5.替换 hashMap 中是指定的key对应的 value(改)
hashmap.replace(key,value); // 返回0
6.返回hashmap中键值对的数量
hashmap.size(); // 返回0
7.getOrDefault(Object key, V defaultValue)
此方法用于当Map集合中有这个key时,就使用这个key对应的value值,如果没有就使用默认值defaultValue;hashmap.getOrDefault(key,defaultValue);
1.2、其他方法
1.检查hashMap中是否存在指定的key对应的映射关系
hashmap.containsKey(key);
2.检查hashMap中是否存在指定的value对应的映射关系
hashmap.containsValue(value);
3.hashmap是否为空
hashmap.isEmpty();
4.HashMap.values() 方法
hashmap.values(); // 返回所有Value值组成的集合
例如:
如果有HashMap: {1=Google, 2=Runoob, 3=Taobao}
则返回Values: [Google, Runoob, Taobao]
2、HashMap的相关例题
2.1、题目介绍
原题链接:128. 最长连续序列 - 力扣(LeetCode)
示例 1:
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是[1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
提示:
0 <= nums.length <= 105-109 <= nums[i] <= 109
2.2、解题
2.2.1、解题思路
使用一个HashMap存储当前遍历过的数字,如果hashMap中已经存在这个数字,说明之前已经处理过这个数字,不做任何处理【是为了防止出现重复数字再次计算造成错误】
每次遍历到新数字时,去hashMap中寻找比它小1的数字和比它大1的数字对应的长度,记为min和max。
如果min、max均为0,说明此时不存在上下界,直接记为1.
当出现min、max不为0时,说明与当前数字有新的上下界,计算出上下界所对应的数字,并在map中修改对应的上下界大小。
若不存在上下界:直接更新为1;
若存在上界不存在下界:更新上界数字长度+1,即max + 1;
若存在下界不存在上界:更新下界数字长度+1,即min + 1;
若上下界均存在:同时更新上下界长度为下界长度+上界长度+1,即min + max + 1
2.2.2、解题图解

数组nums从i=0开始遍历,has为哈希表,result用来保存最后的结果,min用来保存键值(key)为 nums[ i-1 ] 在哈希表中所对应的值(value) ;max用来保存键值(key)为 nums[ i+1 ] 在哈希表中所对应的值(value) ,now保存当前循环最长连续序列的结果用于和result进行比较

当前的 i = 0 ,nums[ i ] = 100, has 中没有 key 为 100 的项,所以让 min = has.getOrDefault(nums[i]-1, 0);max = has.getOrDefault(nums[i]+1, 0);由于 has 中没有 key 为 99(nums[i]-1) 的项, 所以 min = 0 ;由于 has 中没有 key 为 101(nums[i]+1) 的项, 所以 max = 0 ;因此 now = 1 ;然后在 has 中添加 key = 100,value = 1 的项;result 小于 now,所以让 result = now = 1

当前的 i = 1 ,nums[ i ] = 4, has 中没有 key 为 4 的项,所以让 min = has.getOrDefault(nums[i]-1, 0);max = has.getOrDefault(nums[i]+1, 0);由于 has 中没有 key 为 3(nums[i]-1) 的项, 所以 min = 0 ;由于 has 中没有 key 为 5(nums[i]+1) 的项, 所以 max = 0 ;因此 now = 1 ;然后在 has 中添加 key = 4,value = 1 的项;result 等于 now,所以 result 不变

当前的 i = 2 ,nums[ i ] = 200, has 中没有 key 为 200 的项,所以让 min = has.getOrDefault(nums[i]-1, 0);max = has.getOrDefault(nums[i]+1, 0);由于 has 中没有 key 为 199(nums[i]-1) 的项, 所以 min = 0 ;由于 has 中没有 key 为 201(nums[i]+1) 的项, 所以 max = 0 ;因此 now = 1 ;然后在 has 中添加 key = 200,value = 1 的项;result 等于 now,所以 result 不变

当前的 i = 3 ,nums[ i ] = 1, has 中没有 key 为 1 的项,所以让 min = has.getOrDefault(nums[i]-1, 0);max = has.getOrDefault(nums[i]+1, 0);由于 has 中没有 key 为 0(nums[i]-1) 的项, 所以 min = 0 ;由于 has 中没有 key 为 2(nums[i]+1) 的项, 所以 max = 0 ;因此 now = 1 ;然后在 has 中添加 key = 1,value = 1 的项;result 等于 now,所以 result 不变

当前的 i = 4 ,nums[ i ] = 3, has 中没有 key 为 3 的项,所以让 min = has.getOrDefault(nums[i]-1, 0);max = has.getOrDefault(nums[i]+1, 0);由于 has 中没有 key 为 2(nums[i]-1) 的项, 所以 min = 0 ;由于 has 中有 key 为 4(nums[i]+1) 的项, 所以 max = 1 ;因此 now = 2 ;然后在 has 中添加 key = 3,value = 2 的项,添加 key = 3 + 1, value = 2 的项(has.put(nums[i]+max, now));result 小于 now,所以让 result = now = 2

当前的 i = 5 ,nums[ i ] = 2, has 中没有 key 为 2 的项,所以让 min = has.getOrDefault(nums[i]-1, 0);max = has.getOrDefault(nums[i]+1, 0);由于 has 中有 key 为 1(nums[i]-1) 的项, 所以 min = 1 ;由于 has 中有 key 为 3(nums[i]+1) 的项, 所以 max = 2 ;因此 now = 4 ;然后在 has 中添加 key = 2,value = 4 的项,添加 key = 2 + 1, value = 4 的项(has.put(nums[i]+max, now)),添加 key = 2 - 1, value = 4 的项(has.put(nums[i]-min, now));result 小于 now,所以让 result = now = 4
最后返回 result ,result 等于 4
2.3、解题代码
class Solution {public int longestConsecutive(int[] nums) {HashMap<Integer, Integer> has = new HashMap<>();int result = 0;for (int i=0; i<nums.length; i++){if (has.get(nums[i]) != null){continue;}int min = has.getOrDefault(nums[i]-1, 0);int max = has.getOrDefault(nums[i]+1, 0);int now = min + max + 1;if (min == 0 && max == 0){has.put(nums[i], now);} else if (min == 0){has.put(nums[i]+max, now);has.put(nums[i], now);} else if (max == 0){has.put(nums[i], now);has.put(nums[i]-min, now);} else{has.put(nums[i]+max, now);has.put(nums[i], 1);has.put(nums[i]-min, now);}result = Math.max(result,now);}return result;}
}

时间复杂度: O(n)
空间复杂度: O(n)
【LeetCode力扣】相关:
【LeetCode力扣】42.接雨水(困难)-CSDN博客
https://blog.csdn.net/m0_65277261/article/details/134291521?spm=1001.2014.3001.5502【LeetCode力扣】287.寻找重复数(中等)-CSDN博客
https://blog.csdn.net/m0_65277261/article/details/134232926?spm=1001.2014.3001.5502【LeetCode力扣】11. 盛最多水的容器 (中等)-CSDN博客
https://blog.csdn.net/m0_65277261/article/details/134102596?spm=1001.2014.3001.5502

相关文章:
java数据结构(哈希表—HashMap)含LeetCode例题讲解
目录 1、HashMap的基本方法 1.1、基础方法(增删改查) 1.2、其他方法 2、HashMap的相关例题 2.1、题目介绍 2.2、解题 2.2.1、解题思路 2.2.2、解题图解 2.3、解题代码 1、HashMap的基本方法 HashMap 是一个散列表,它存储的内容是键…...
快速了解ChatGPT(大语言模型)
目录 GPT原理:文字接龙,输入一个字,后面会接最有可能出现的文字。 GPT4 学会提问:发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记: Lee老师幽默的开场: GPT:chat Ge…...
计算机软件的分类
以功能进行分类,计算机软件通常可以分为系统软件和应用软件两大类。 系统软件:系统软件是计算机运行和管理的基本软件,包括操作系统、驱动程序、系统工具和服务程序等。操作系统是系统软件的核心,负责管理计算机的硬件资源、提供用…...
数据库应用:Ubuntu 20.04 安装MongoDB
目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB (1)概念 …...
服务器配置 jupyter lab,并在本地浏览器免密登陆
一、背景 快速搭建一个jupyter lab 不用每次用ssh登录输入密码 二、步骤 方法1、临时在服务器启动 jupyter lab,并在本地浏览器免密登陆 两句命令解决 pip install jupyterlabnohup jupyter lab --ServerApp.ip"*" --ServerApp.password"" -…...
WebUI自动化学习(Selenium+Python+Pytest框架)002
新建项目 New Project 新建一个python代码文件 file-new-python file 会自动创建一个.py后缀的代码文件 注意:命名规则,包含字母、数字、下划线,不能以数字开头,不能跟python关键字或包名重复。 ********************华丽分割线********************…...
miot-plugin-sdk. npm install安装失败
miot-plugin-sdk-npm install安装失败 最紧公司要开发一台智能设备,经过同事的对比,选中了米家作为云平台,于是,我就负责开发app界面端,根据官方文档教程 下载了miot-plugin-sdk 程序,准备开始开发,结果悲…...
抓取微信好友列表信息
本文实现的是一种较为安全、简洁、高效的抓取微信好友信息的方法。 实现工具:微信pc端、影刀RPA 主要流程: 手动—前期准备,电脑登陆微信,打开联系人页,使得联系人分类“A”显现在微信窗口界面 自动—运行程序&#…...
创建JDK8版本的SpringBoot项目的方法
目录 一.通过阿里云下载 二.通过IDEA创建 1.下载安装JDK17 2.创建SpringBoot 3.X的项目 3.把JDK17改成JDK8 截止到2023.11.24,SpringBoot不再支持3.0X之前的版本,3.0X之后的版本所对应的JDK版本为JDK17,下面介绍如何在idea上继续使用JDK…...
Python【走出棋盘】
要求: 某个人进入如下一个棋盘中,要求从左上角开始走, 最后从右下角出来(要求只能前进,不能后退), 问题:共有多少种走法? 0 0 0 0 0 0 0 0 0 0 0 0 0 …...
软件工程 - 第8章 面向对象建模 - 2 静态建模
静态建模(类和对象建模) 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构,在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…...
ESXi vSAN 整合多主机磁盘
VSAN 与 RAID区别: vSAN 可以管理 ESXi 主机,且只能与 ESXi 主机配合使用。一个 vSAN 实例仅支持一个群集。vSAN 不需要外部网络存储来远程存储虚拟机文件,例如光纤通道 (FC) 或存储区域网络 (SAN) 使用传统存储,存储管理员可以…...
手机充电 显示连接耳机 (充电没外放声音) 并且充电速度很慢
现象 手机插入充电线充电 外放消失 按音量调节键 显示正在调节耳机音量 手机充电快充标识丢失 显示现在不是快充 充电速度很慢,边玩边用半小时不到2% 经测试:快充正常应该是20w,现在只有3w. 结论 排查后发现是数据线坏了,扔掉后随便换了根c2c的雷电线发现充电速度正常,不…...
前端开发的前世今生
现代前端开发简介 前端开发的历史CGIServer PageRIAAJAX前端组件化和工程化 现代前端开发模式前端工程化前端组件化单页应用微前端 更多相关技术游戏开发Web Assembly 小结 今天我们来稍微聊一下现代前端开发的过去和现状。 前端开发的历史 CGI 在互联网刚刚开始兴起的时代&a…...
CAP概念和三种情况、Redis和分布式事务的权衡
借鉴:https://cloud.tencent.com/developer/article/1840206 https://www.cnblogs.com/huanghuanghui/p/9592016.html 一:CAP概念和三种情况 1.概念: C全称Consistency(一致性):这个表示所有节点返回的数…...
npm pnpm yarn(包管理器)的安装及镜像切换
安装Node.js 要安装npm,你需要先安装Node.js。 从Node.js官方网站(https://nodejs.org)下载并安装Node.js。 根据你的需要选择相应的版本。 一路Next,直到Finish 打开CMD,输入命令来检查Node.js和npm是否成功安装 nod…...
Javase | Java工具类、(SSM)各种依赖的作用
目录: Java工具类:日期工具类文件上传工具类 短信工具类验证码工具类邮件工具类代码生成器 (SSM)各种依赖的作用:spring-context 依赖:spring-context-supprt 依赖:spring-tx 依赖:mysql-connector-java 依赖:spring-j…...
深入探究Python中的JSON、Pickle和Shelve模块:特性与区别
更多资料获取 📚 个人网站:ipengtao.com 在Python中,处理数据序列化和持久化是极其重要的。JSON、Pickle和Shelve是三种常用的模块,它们提供了不同的方法来处理数据的序列化和持久化。本文将深入研究这三个模块,探讨它…...
文心大模型3.5 VS ChatGPT3.5,谁更会写代码 ?
问题:请帮我写一段代码,SAP物料凭证创建接口的代码 ? 文心大模型3.5:写了一段 python ChatGPT3.5 : 写的还可以啊,理解的很到位,而且用的是S/4新语法呀 ! DATA: lt_header TYPE TABLE OF bapi2017_gm_head_…...
【网络安全】用永恒之蓝(Eternal blue)测试windows系统的安全性
一、kali默认账户和密码都为kali 攻击机:Linux 的 kali 目标机:Windows7 x64 二、kali、metasploit、metasploit 攻击 windows操作系统、metasploit 攻击 永恒之蓝 全流程 ①kali:是黑客攻击机。开源免费的Linux操作系统,含有300…...
倒反天罡了!Cursor自研模型反超Opus 4.6!价格脚踝斩,氛围编程沸腾了
因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号,领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师ÿ…...
无片外电容的LDO电路设计手册:完整IP现成电路,包含过温与过流保护、带隙与BUFFER,性能...
无片外电容LDO电路设计 完整IP现成电路,具有过温保护和过流保护,带隙,BUFFER都有 性能指标已流片验证 同时有相关文献、各模块电路功能分析简化计算笔记,适合学习入门不适合纵向可以附赠一些自己学习时觉得比较有帮助的资料。 有好…...
永磁同步电机矢量控制仿真避坑指南:从PI参数整定到SVPWM模块优化
永磁同步电机矢量控制仿真避坑指南:从PI参数整定到SVPWM模块优化 在工业自动化和电力驱动领域,永磁同步电机(PMSM)凭借其高效率、高功率密度和优异的动态性能,已成为众多应用场景的首选。然而,要实现PMSM的…...
教师评估软件市场迎增长机遇:未来六年CAGR锁定6.7%,教育数字化转型添动能
据恒州诚思调研统计,2025年全球教师评估软件市场规模约30.58亿元,预计未来将持续平稳增长,到2032年市场规模将接近47.92亿元,未来六年复合年增长率(CAGR)为6.7%。在教育行业数字化转型加速的背景下…...
学习网络安全至少需要什么配置的电脑?
很多同学对于学习 Web 渗透所需的电脑配置仍有疑问,所以老师结合自己的教学经验,总结了关于电脑配置要求的一些内容,遂成此文。当然,对于电脑配置的追求是无上限的,所以有条件的话最好还是搞一台配置强劲的电脑。 一、…...
便利店老板的备货神器——基于粒子群优化支持向量机的单日关东煮销量预测
基于粒子群优化支持向量机(PSO-SVM)的时间序列预测 PSO-SVM时间序列 matlab代码暂无Matlab版本要求 -- 推荐 2018B 版本及以上 采用 Libsvm 工具箱(无需安装,可直接运行),仅支持 Windows 64位系统昨天便利店刚进了一箱新口味的魔芋…...
YOLO12快速部署指南:Gradio界面已配好,启动就能用
YOLO12快速部署指南:Gradio界面已配好,启动就能用 1. 为什么选择YOLO12镜像 YOLO12作为2025年最新发布的目标检测模型,带来了革命性的注意力为中心架构。这个预配置好的镜像让您无需任何复杂操作,就能立即体验最先进的目标检测技…...
IIS请求筛选规则实战:手把手教你用‘拒绝字符串’精准拦截SQL注入和恶意爬虫
IIS请求筛选规则实战:构建精准防御体系的完整指南 当你的网站遭遇SQL注入攻击时,服务器日志里那些可疑的 OR 11--字符串是否让你夜不能寐?面对每天数十万次的恶意爬虫扫描,是否觉得传统的防火墙规则力不从心?IIS的请求…...
Comsol 脉冲激光诱导等离子体仿真模型:探索微观世界的奇妙之旅
Comsol脉冲激光诱导等离子体仿真模型 利用脉冲激光作为热源,在氩气环境中诱导产生等离子体,主要体现出等离子体的密度、等离子体温度等参数 可以为激光诱导等离子体提供准确的参考在科研与工程领域,对脉冲激光诱导等离子体的深入研究有着举足…...
Jetson Nano实战:FFmpeg与Nginx的RTMP推流配置全解析
1. Jetson Nano与RTMP推流基础认知 第一次接触Jetson Nano做视频推流时,我对着这块信用卡大小的开发板研究了整整三天。这块搭载了128核NVIDIA Maxwell GPU的小家伙,其实是个隐藏的视频处理高手。RTMP协议就像快递公司的"当日达"服务ÿ…...
