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博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134291521?spm=1001.2014.3001.5502【LeetCode力扣】287.寻找重复数(中等)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134232926?spm=1001.2014.3001.5502【LeetCode力扣】11. 盛最多水的容器 (中等)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134102596?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/207696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Peter算法小课堂—差分与前缀和

差分 Codeforces802 D2C C代码详解 差分_哔哩哔哩_bilibili 一维差分 差分与前缀和可以说成减法和加法的关系、除法和乘法的关系、积分和微分的关系&#xff08;听不懂吧&#xff09; 给定数组A&#xff0c;S为A的前缀和数组&#xff0c;则A为S的差分数组 差分数组构造 现…

电子学会C/C++编程等级考试2021年06月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字三角形问题 (图1) 图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注意:路径上的每一步只能从一个数走到下一层上和它…

Android Studio新版UI介绍

顶部菜单栏 左侧主要菜单入口项目名称分支名称 展开之后&#xff0c;主要功能与原来菜单栏功能一样&#xff0c;最大的变化就是把setting独立出去了。 而项目名称这里&#xff0c;展开就可以看到打开的历史工程列表&#xff0c;可以直接新建工程&#xff0c;原来需要在项目名称…

vivado实现分析与收敛技巧3-面向非工程用户的智能设计运行建议

要使用智能设计运行功能特性 &#xff0c; 需要 Vivado 工程。这是因为需要进行运行管理。以下指示信息解释了创建综合后工程的最简单方法。这些信息适用于以下流程的用户&#xff1a; • 非工程实现运行 • 使用较低版本的 Vivado 或第三方综合工具进行综合 访问智能设计…

Git——分支应用进阶

主要内容包括以下几个方面&#xff1a; 长期分支和短期分支的类型以及用途。多种分支模型&#xff0c;其中包括基于工作流的主题分支。不同分支模型的发布流程。在多个预览版程序中使用分支修复安全问题。远程跟踪分支和refspecs规范&#xff0c;以及默认远程版本库配置。拉取…

测评补单助力亚马逊,速卖通,国际站卖家抢占市场,提升转化和评分

想要快速提升商品的销量&#xff0c;测评补单这种方法见效是最快的。特别是新品上线&#xff0c;缺少用户评价&#xff0c;转化率不好&#xff0c;很多商家新品上线都会做测评补单&#xff0c;搞些商品好评&#xff0c;不但可以提升转化&#xff0c;同时在平台也可以获得更多展…

Redis:主从复制

目录 概念配置步骤通过命令配置主从复制原理薪火相传反客为主哨兵(Sentinel)模式原理配置SpringBoot整合Sentinel模式 概念 主机更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。 作用&#xff1a; …

Python+Requests模块添加cookie

请求中添加cookies 对于某些网站&#xff0c;登录然后从浏览器中获取cookies&#xff0c;以后就可以直接拿着cookie登录了&#xff0c;无需输入用户 名密码。 一、在参数中添加cookie 在发送请求时使用cookies 代码示例&#xff1a; import requests # 1&#xff0c;在参数…

ZFPlayer 在tableView列表中播放视频架构设计

需求背景 需要在如图所示的列表中播放视频&#xff0c;并且播放视频在对应的卡片上&#xff0c;滚动结束的时候&#xff0c; 完整露出封面图的第一个视频自动播放 分析 根据需求&#xff0c;是滚动的时候获取符合条件的cell&#xff0c;并且 在cell的封面图上播放视频&#x…

CSS中的非布局样式+CSS布局 前端开发入门笔记(十一)

CSS中的非布局样式 在CSS中&#xff0c;非布局样式是指那些不会直接影响页面布局的样式。这些样式主要关注的是元素的颜色、字体、背景、边框、阴影等视觉效果。以下是一些常见的非布局CSS样式&#xff1a; 文本样式&#xff1a;包括字体&#xff08;font-family&#xff09;…

传统算法:使用 Pygame 实现归并排序

使用 Pygame 模块实现了归并排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过归并排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序将数组递归地分成两半,分别进行排序,然后再将…

小白备战蓝桥杯:Java常用API

一、什么是API 就是别人写好的一些类&#xff0c;给咱们程序员直接拿去调用即可解决问题的 我们之前接触过的Scanner和Random都是API 但java中提供的API很多&#xff0c;我们没有必要去学习所有的API&#xff0c;只需要知道一些常用的API&#xff0c;再借助帮助文档去使用AP…

从HumanEval到CoderEval: 你的代码生成模型真的work吗?

本文主要介绍了一个名为CoderEval的代码生成大模型评估基准&#xff0c;并对三个代码生成模型&#xff08;CodeGen、PanGu-Coder和ChatGPT&#xff09;在该基准上的表现进行了评估和比较。研究人员从真实的开源项目中的选取了代码生成任务来构建CoderEval&#xff0c;并根据对外…

Python函数专题(下)侯小啾python领航班系列(十三)】

Python函数专题(下)侯小啾python领航班系列(十三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

腾讯云年末感恩回馈:2核2G4M云服务器118元1年,新老用户同享!

腾讯云年末感恩回馈活动开始了&#xff0c;年度爆款2核2G4M云服务器118元/年&#xff0c;新老用户同享&#xff0c;记得抓住上云好时机&#xff01; 活动地址&#xff1a; 点此直达腾讯云年末感恩回馈 活动详情&#xff1a; 配置说明&#xff1a; 2核2G 独享CPU性能50GB SSD…

观《王牌对王牌:国宝回国》有感 —— AI绘画之古画修复对比图

一、前言 上周《王牌对王牌》节目的主题是《国宝回国》&#xff0c;而今天的AI绘画的灵感&#xff0c;就来源于这期节目。 下面这组图&#xff0c;左侧部分因时间的流逝而显现出褪色和损伤的痕迹&#xff0c;色彩变得暗淡&#xff0c;细节也因年代久远而变得模糊不清。 而右…

知虾平台丨优化Shopee店铺运营,提升销售利润——了解知虾平台

在如今竞争激烈的电商市场中&#xff0c;Shopee作为一家快速发展的平台&#xff0c;吸引了众多卖家加入。然而&#xff0c;要在Shopee上取得成功并实现可观的销售利润&#xff0c;并不是一件容易的事情。为了帮助卖家更好地了解市场趋势、优化商品关键词、监控竞争对手等&#…

c题目13:验证100以内的数是否满足哥德巴赫猜想。(任一大于2的偶数都可以写成两个质数之和)

每日小语 活下去的诀窍是&#xff1a;保持愚蠢&#xff0c;又不能知道自己有多蠢。——王小波 自己思考 即要让第一个质数与这个数减去第一个质数的值都为质数&#xff0c;所以要满足几个条件 1.abc 2.a为质数 3.b为质数 这里是否可以用到我之前刚学的自己设置的那个判断…

daima8资源网整站数据打包完整代码(集成了ripro9.1主题,开箱即用)

基于ripro9.1完全明文无加密后门版本定制开发&#xff0c;无需独立服务器&#xff0c;虚拟主机也可以完美运营&#xff0c;只要主机支持php和mysql即可。整合了微信登录和几款第三方的主题文件&#xff0c;看起来更美观一些。站长本人就是程序员&#xff0c;所以本站的代码资源…

力扣每日一题(2023-11-30)

力扣每日一题 题目&#xff1a;1657. 确定两个字符串是否接近 日期&#xff1a;2023-11-30 用时&#xff1a;21 m 07 s 时间&#xff1a;11ms 内存&#xff1a;43.70MB 代码&#xff1a; class Solution {public boolean closeStrings(String word1, String word2) {if(word1.…