算法——哈希表

在这里插入图片描述

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.rhkb.cn/news/301116.html

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

相关文章

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群&#xff0c;相信诸位对这个概念并不陌生&#xff0c;集群已成为现时代中&#xff0c;保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用&#xff0c;因为只有一个节点&#xff0c;因此当该节点出现任意类型的故障&#xff08;网络、硬件…

YooAssets 使用相关

## 使用 YooAssets 动态加载原生文件时候 > 原生文件&#xff1a;txt&#xff1b;json&#xff1b;等需要直接保存文件内string字符的文件 需要将打包方式设置成为&#xff0c;PackRawFile 并且加载时候使用 API &#xff1a; YooAssets.LoadRawFileSync()YooAssets.LoadRa…

安卓java打包uniapp原生插件 和 uniapp使用安卓android原生插件

1.uniapp dcloud官方文档 简介 | uni小程序SDK 2.前提&#xff0c;需要有经验的安卓java开发人员&#xff0c;并且同时具备uniapp移动端开发经验。说明&#xff1a;android打包的.aar和uniapp需要的.aar是不一样的&#xff0c;uniapp需要的.aar是需要有一些特定配置的&#x…

在Ubuntu上搭建Prometheus + Grafana监控系统

1.Prometheus 部署 从官网下载页面找到最新的二进制文件下载 cd ~ curl -LO https://github.com/prometheus/prometheus/releases/download/v2.51.1/prometheus-2.51.1.linux-amd64.tar.gz将文件解压到指定目录 tar xf prometheus-2.51.1.linux-amd64.tar.gz -C /usr/local为…

解决IDEA 控制台中文乱码

运行某个项目时IntelliJ IDEA 控制台中文乱码&#xff0c;但其他的项目是正常的。接口文档也显示乱码&#xff1a; 一、修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码 上方导航栏“File→Settings…”进入配置页面&#xff0c;在“Editor”中下滑找到“File Encodings…

centos7.2系统部署ZooKeeper集群和Kafka集群(集群应用系统商城前置环境)

本次实验将使用centos7.2系统部署部署ZooKeeper集群因为Kafka依赖于ZooKeeper&#xff0c;所以我们一并进行部署。 实验所示的资源软件已上传至百度网盘&#xff0c;需要自取。 链接&#xff1a;https://pan.baidu.com/s/1a-7_iAIX0DBAMkF9bhiTcA?pwd2333 提取码&#xff1…

基于javassm实现的农产品供销服务系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

2024/4/2—力扣—不用加号的加法

代码实现&#xff1a; 思路&#xff1a;位运算&#xff0c;利用了异或和与的特性&#xff0c;异或操作与加操作的区别在于异或操作在二进制状态下两个数同1不进位&#xff0c;只是置为0&#xff0c;其他均相同&#xff0c;那么使用与运算计算进位值&#xff0c;补齐异或操作的缺…

深入理解指针2:数组名理解、一维数组传参本质、二级指针、指针数组和数组指针、函数中指针变量

目录 1、数组名理解 2、一维数组传参本质 3、二级指针 4、指针数组和数组指针 5、函数指针变量 1、数组名理解 首先来看一段代码&#xff1a; int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0; } 输出的结果是&…

jupyter python paramiko 网络系统运维

概述 通过使用jupyter进行网络运维的相关测试 设备为H3C 联通性测试 import paramiko import time import getpass import re import os import datetimeusername "*****" password "*****" ip "10.32.**.**"ssh_client paramiko.SSHCli…

Nginx配置之localhost和反向代理

文章目录 第一步、查看安装位置和配置文件第二步、web服务器设置第三步、localhost 指令第四步、设置反向代理 清明假期&#xff0c;在家练习Nginx配置&#xff0c;在前期【 linux环境下安装配置nginx代理服务器】已经完成nginx环境搭建&#xff0c;本期主要实践web服务器&…

【分治算法】大整数乘法Python实现

文章目录 [toc]问题描述基础算法时间复杂性 优化算法时间复杂性 Python实现 个人主页&#xff1a;丷从心. 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 X X X和 Y Y Y都是 n n n位二进制整数&#xff0c;计算它们的乘积 X Y XY XY 基础…

libVLC 音频立体声模式切换

在libVLC中&#xff0c;可以使用libvlc_audio_set_channel函数来设置音频的立体声模式。这个函数允许选择不同的音频通道&#xff0c;例如立体声、左声道、右声道、环绕声等。 /*** Set current audio channel.** \param p_mi media player* \param channel the audio channel…

数据挖掘及其近年来研究热点介绍

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

基于单片机16路多路抢答器仿真系统设计

**单片机设计介绍&#xff0c;基于单片机16路多路抢答器仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机16路多路抢答器仿真系统的设计概要主要涵盖硬件设计、软件编程以及功能实现等方面。以下是针对该设计的详细概…

SAP HCM PT 2003修改班次,PP61无法自动更新

今天遇到一个问题&#xff0c;2003修改班次以后PP61无法自动更新&#xff0c;开始一直以为是什么配置点漏掉&#xff0c;但是发现开发机没问题&#xff0c;后来发现是用户选保存的时候选中目标计划的完成&#xff0c;这个是保存到实际计划的&#xff0c;数据存储psoll中&#x…

redis的常用基本命令与持久化

文章目录 redis的基本命令1.授权密码2.增加、覆盖、查询、删除、切换库名、移动、清空数据库 Redis持久化RDB模式主动备份自动备份RDB备份过程 AOF备份模式开启AOF备份模式执行流程 总结 redis的基本命令 1.授权密码 config set requirepass 密码设置完密码需要认证密码以后才…

【御控物联】JavaScript JSON结构转换(19):数组To对象——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

软件设计师29--并发控制

软件设计师29--并发控制 考点1&#xff1a;事务的特性例题&#xff1a; 考点2&#xff1a;并发问题并发产生的问题丢失更新不可重复读问题读“脏”数据 考点3&#xff1a;封锁协议例题&#xff1a; 考点1&#xff1a;事务的特性 原子性&#xff08;Atomicity&#xff09;&…

C顺序表:通讯录

目录 前言 通讯录数据结构 通讯录初始化 查找名字 增加联系人 删除联系人 展示所有联系人 查找联系人 修改信息 销毁通讯录 完整通讯录代码 前言 数据结构中的顺序表如果已经学会了&#xff0c;那么我们就可以基于顺序表来完成一个通讯录了 通讯录其实我们使用前…