算法——哈希表

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 小比特 大梦想

此篇文章与大家分享分治算法关于哈希表相关算法的专题
如果有不足的或者错误的请您指出!

1.哈希表简介

哈希实际上可以简单认为是一个存储数据的容器,用于快速查找某个元素,时间复杂度仅为O(1),怎么有时候需要频繁查找某一个数的时候,就可以使用哈希表
那我们怎么使用哈希表呢??
分成两种,一种是使用编程语言自带的容器,如java里面的Map和Set
另外一种是我们自定义一个数组来作为哈希表,这种通常出现在我们对字符串中的字符进行操作的时候,我们可以自定义一个int[26] (如果都是小写字符),或者是当数据范围比较小的时候,使用数组模拟哈希表往往是更快的

2.两数之和

题目:两数之和

2.1解析

最容易想到的就是暴力枚举,即两个两个枚举求和,看看和是否满足为target
而暴力枚举也分成两种:

第一种是定住一个数,从这个数往后遍历,看看是否能找到值为target - nums[i]的数
在这里插入图片描述

第二种是定住一个数,从这个数往前遍历,看看是否能找到值为target - nums[i]的数
在这里插入图片描述
但是时间复杂度都达到的O(n^2)级别
而对于第二种,我们的优化策略是比较好想的,就是利用hash表,当i从前往后遍历的时候,就可,当我们回头找前面的数中是否有值为target - nums[i]的时,直接在哈希表中寻找即可,时间复杂度为O(n)

2.2题解

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> hash = new HashMap<>();for(int i = 0; i < nums.length; i++){if(hash.containsKey(target-nums[i])){return new int[]{hash.get(target-nums[i]),i};}hash.put(nums[i],i);}return new int[]{-1,-1};}
}

3.判定是否互为字符重排

题目:判定是否互为字符重排

3.1解析

两个互为重排字符串的字符串,首先字符串的长度一定想等,其次,其中每个字符的出现的次数也一定相等.那么我们直接用哈希表来统计其中一串字符串中每个字符出现的次数,接着遍历另一串字符串,每次将前面的哈希表中对应字符的个数减1,如果出现某一个字符出现的个数为负数,那么就一定不是重排字符串
而我们这里最优的解法就是用数组模拟哈希表

3.2题解

class Solution {public boolean CheckPermutation(String s1, String s2) {if(s1.length() != s2.length()){return false;}int[] hash = new int[26];for(char ch : s1.toCharArray()){hash[ch-'a']++;}for(char ch : s2.toCharArray()){hash[ch-'a']--;if(hash[ch-'a'] == -1){return false;}}return true;}
}

4.存在重复元素

题目:存在重复元素

4.1解析

与第二题相似,只不过这道题只需要存储值即可,所以直接用set

4.2题解

class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> hash = new HashSet<>();for(int x : nums){if(hash.contains(x)){return true;}hash.add(x);}return false;}
}

5.存在重复元素II

题目:存在重复元素II

5.1解析

和上一道题思路一样,只不过多了个判断
有一个细节问题:
在这里插入图片描述

当遍历第二个1的时候,第一个1已经在哈希表中存在,但是他们的下标之差不满足 <= k,而此时我们应该让这个1取代前面的1,因为后面如果再遇到1,满足条件也只可能与当前的1

5.2题解

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer,Integer> hash = new HashMap<>();for(int i = 0; i < nums.length; i++){if(hash.containsKey(nums[i])){if(i - hash.get(nums[i]) <= k){return true;}}hash.put(nums[i],i);}return false;}
}

6.字母异位词分组

题目:字符异位词分组

6.1解析

此题我们就能很好的感受到哈希表的优势了
题目要我们把所有的异位词都组合在一块,那么我们首先就要判断哪些字符串是异位词.我们采用对字符串进行排序的方法,排完序后对字符串进行比较即可
我们可以建立一个HashMap,键是String,存放的是排序后的字符串,值是List< String>
,如果判断某个字符串和此时哈希表中的某个键是异位词,那么直接将这个字符串插到当前的List后面即可

6.2题解

class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>> hash = new HashMap<>();for(String str : strs){char[] tmp = str.toCharArray();Arrays.sort(tmp);String key = Arrays.toString(tmp);if(!hash.containsKey(key)){hash.put(key,new ArrayList());}hash.get(key).add(str);}return new ArrayList(hash.values());}
}

感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 小比特 大梦想

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

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

相关文章

A股风格因子看板(2024.4第1期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景 露等。 今日为该因子跟踪第1期&#xff0c;指数组合数据截止日2024-03-31&#xff0c;要点如下 近1年A股风格因子收益走…

vue快速入门(十)v-bind动态属性绑定

注释很详细&#xff0c;直接上代码 上一篇 新增内容 图片切换逻辑动态绑定的完整写法与简写方法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

Codigger Desktop:用户体验与获得收益双赢的革新之作(一)

上周&#xff0c;我们介绍了Codigger Desktop凭借其强大的功能、稳定的性能以及人性化的设计&#xff0c;成为了广大开发者的得力助手。Codigger Desktop除了是开发者的利器外&#xff0c;它以其出色的用户体验和创新的收益模式&#xff0c;为用户提供了一个全新的选择。Codigg…

解密电子邮件组:高效沟通利器,团队协作新纪元

在当今时代&#xff0c;电子邮件无处不在&#xff0c;尤其是对于商业活动而言。电子邮件的重要性不容忽视&#xff0c;因为它在沟通中极为高效。然而&#xff0c;电子邮件也存在降低工作效率和阻碍流程的风险。在这种情况下&#xff0c;电子邮件群组就是最佳的解决方案。什么是…

基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的高校招生系统1拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;学生管理、专业管理、报名管理、录取通知管理、招生公告管理等 用户&#xff1a;登录注册、报…

景区智慧导览平台

一、项目背景与意义 随着信息化、智能化技术的不断发展&#xff0c;以及旅游市场的日益繁荣&#xff0c;游客对景区游览体验的要求也在不断提升。传统的景区导览方式往往存在信息不全、更新不及时、服务不便捷等问题&#xff0c;已无法满足现代游客的需求。因此&#xff0c;开…

Linux/Lame

Lame 今天随便乱逛发现这台机器貌似是 HackTheBox 平台的第一台机器&#xff0c;而且我还没做过&#xff0c;从简介上来看的话是一台很简单的机器&#xff0c;快快的玩一下 Enumeration nmap 首先用 nmap 扫描一下常见的端口&#xff0c;发现系统对外开放了 21,22,139,445 端…

优优嗨聚集团:个人债务,危险的边缘舞者

在现代社会&#xff0c;个人债务已成为一个不容忽视的现象。随着消费水平的提高和信贷市场的繁荣&#xff0c;越来越多的人选择通过借贷来满足生活或投资的需求。然而&#xff0c;个人债务如同一把双刃剑&#xff0c;既能助力我们实现梦想&#xff0c;也可能让我们陷入困境。那…

Java智慧校园系统源码 微信小程序+电子班牌

Java智慧校园系统源码 微信小程序电子班牌 通过设备管理对百纳智慧校园的智慧班牌以及百纳智慧屏&#xff08;校牌&#xff09;进行统一集中式管理&#xff0c;支持浏览所有设备的基本信息以及在离线状态&#xff0c;支持添加设备、设备一键开关机、一键重启、设置节假日开关机…

申请免费SSL证书

SSL证书是数字证书的一种&#xff0c;配置在服务器上&#xff0c;起到文件信息传输加密的作用。由受信任的数字证书颁发机构CA在验证服务器身份后颁发&#xff0c;防止第三方窃取或篡改信息。 具体来说&#xff0c;SSL证书在客户端浏览器与Web服务器两端建立一条SSL安全通道&a…

「Qt Widget中文示例指南」如何实现一个分组框

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Group Box&#xff…

备战蓝桥杯Day37 - 真题 - 特殊日期

一、题目描述 思路&#xff1a; 1、统计2000年到2000000年的日期&#xff0c;肯定是需要遍历 2、闰年的2月是29天&#xff0c;非闰年的2月是28天。我们需要判断这一年是否是闰年。 1、3、5、7、8、10、12月是31天&#xff0c;4、6、9、11月是30天。 3、年份yy是月份mm的倍数…