Hash表算法

哈希表

  • 理论知识(本文来自于代码随想录摘抄)
    • 什么是哈希
    • 常见的三种哈希结
      • 数组:
      • set:
      • map:
      • 其他常用方法或者技巧(自己总结的)
    • 练习题和讲解
      • 有效的字母移位词
      • 349. 两个数组的交集
      • 1. 两数之和
      • 454. 四数相加 II
      • 15. 三数之和
    • 总结

理论知识(本文来自于代码随想录摘抄)

什么是哈希

哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:
在这里插入图片描述
那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里

常见的三种哈希结

当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。
数组
set (集合)
map(映射)

数组:

当目标的范围是已知的,是小的,我们会使用数组。(经常使用,所以少介绍。)

set:

在这里插入图片描述

map:

在这里插入图片描述

其他常用方法或者技巧(自己总结的)

在这里插入图片描述
10,用来判断某个值是否存在哈希表中:containsKey()

if(result.containsKey(temp)){}

练习题和讲解

有效的字母移位词

使用int
前置知识:
字母a-z,A-Z的ASCII码是连续的。
所以’a’-‘a’=0;‘z’-‘a’=25;
在这里插入图片描述

class Solution {public boolean isAnagram(String s, String t) {int[] arr=new int[26];              //用来存储26个字母出现的次数for(int i=0;i<s.length();i++){      //字符串用length()方法,数组为length。因为对于字符串,length是方法,数组是内置属性。    arr[s.charAt(i)-'a']++;             //charAt(i)获取字符串中i位置的字符。  我们在对于的下标的位置+1.比如出现z,则是'z'-'a',在25这个位置+1.};for(int i=0;i<t.length();i++){arr[t.charAt(i)-'a']--;         //目的同样,在对应位置-1,抵消s字符串中出现的字母。};for(int a:arr){                     //增强for循环方法。if(a!=0){                       //进行判断,如果不等0,证明两个里面的出现字母的数量不一致。return false;}}return true;}
}

349. 两个数组的交集

349. 两个数组的交集
使用set

class Solution {public int[] intersection(int[] nums1, int[] nums2) {if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {return new int[0];}                   //首先判断是否为空Set<Integer> set1 = new HashSet<>();        //使用set可以直接去重Set<Integer> resSet = new HashSet<>();//遍历数组1for (int i : nums1) {set1.add(i);    }//遍历数组2的过程中判断哈希表中是否存在该元素for (int i : nums2) {if (set1.contains(i)) {         //contains() 判断这个值是否在哈希表中resSet.add(i);}}//另外申请一个数组存放setRes中的元素,最后返回数组int[] arr = new int[resSet.size()];int j = 0;for(int i : resSet){arr[j++] = i;}return arr;}
}

1. 两数之和

1. 两数之和
使用map(需要存放 key value)

class Solution {public int[] twoSum(int[] nums, int target) {// 创建一个 HashMap 来存储数字及其对应的索引Map<Integer, Integer> map = new HashMap<>();int n = nums.length;// 遍历数组for (int i = 0; i < n; i++) {// 计算当前元素的补数int temp = target - nums[i];// 检查补数是否在 HashMap 中if (map.containsKey(temp)) {// 找到结果,那么返回当前索引和补数的索引return new int[]{map.get(temp), i};}// 如果没有找到补数,就把当前数字和它的索引放入 HashMapmap.put(nums[i], i);}// 如果没有找到,返回一个空数组,考虑到题目保证有解这里可以省略return new int[]{};}
}

454. 四数相加 II

454. 四数相加 II

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res = 0;//不仅要保存值,还需要保存其出现次数,所以使用map(key,value)来进行存储数据。Map<Integer, Integer> map = new HashMap<Integer, Integer>();//统计两个数组中的元素之和,同时统计出现的次数,放入mapfor (int i : nums1) {for (int j : nums2) {int sum = i + j;map.put(sum, map.getOrDefault(sum, 0) + 1);//getOrDefault这个的意思是,如果存在,返回存在的值,不存在返回default0}}//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数for (int i : nums3) {for (int j : nums4) {//因为本题不去重,所以有不同组合,需要统计的值为 res+sum(对应的值);res += map.getOrDefault(0 - i - j, 0);}}return res;}
}

15. 三数之和

15. 三数之和

使用哈希集合:

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {// 如果第一个元素大于零,不可能凑成三元组if (nums[i] > 0) {return result;}// 三元组元素a去重if (i > 0 && nums[i] == nums[i - 1]) {continue;}HashSet<Integer> set = new HashSet<>();for (int j = i + 1; j < nums.length; j++) {// 三元组元素b去重if (j > i + 2 && nums[j] == nums[j - 1] && nums[j - 1] == nums[j - 2]) {continue;}int c = -nums[i] - nums[j];if (set.contains(c)) {result.add(Arrays.asList(nums[i], nums[j], c));set.remove(c); // 三元组元素c去重} else {set.add(nums[j]);}}}return result;}
}

使用双指针(更为推荐)

class Solution {public List<List<Integer>> threeSum(int[] nums) {//二维集合,因为不止一个集合List<List<Integer>> ans=new ArrayList();int len=nums.length;//如果值小于3,则没有意义if(len<3||nums==null) return ans;//排序,更方便我们双指针的移动Arrays.sort(nums);//定i的位置,然后动left和right两个指针的位置来凑0for(int i=0;i<len;i++){//如果第一个i都>0,则不可能三数之和为0if(nums[i]>0) break;//题目去重,所以我们判断前一位值如果等于后一位,则跳过。if(i>0&&nums[i]==nums[i-1]) continue;//定义左右指针    int L=i+1;int R=len-1;   while(L<R){int sum =nums[i]+nums[R]+nums[L];//如果相等,则添加进入二维数组中if(sum==0){ans.add(Arrays.asList(nums[i],nums[L],nums[R]));//归零while(L<R&& nums[L]==nums[L+1]) L++;while(L>R&& nums[R]==nums[R-1]) R--;L++;R--;}//和小,就左指针右移,和大,就右指针左移else  if(sum<0)L++;else if(sum>0)R--;}}//返回二维数组。return ans;}
}

总结

哈希表理论基础
在关于哈希表,你该了解这些! (opens new window)中,我们介绍了哈希表的基础理论知识,不同于枯燥的讲解,这里介绍了都是对刷题有帮助的理论知识点。

一般来说哈希表都是用来快速判断一个元素是否出现集合里。

对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。

哈希函数是把传入的key映射到符号表的索引上。

哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。

接下来是常见的三种哈希结构:

数组
set(集合)
map(映射)
在C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构的底层实现和用途都有所不同,在关于哈希表,你该了解这些! (opens new window)中我给出了详细分析,这一知识点很重要!

例如什么时候用std::set,什么时候用std::multiset,什么时候用std::unordered_set,都是很有考究的。

只有对这些数据结构的底层实现很熟悉,才能灵活使用,否则很容易写出效率低下的程序。

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

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

相关文章

如何选择适合自己的 Python IDE

集成开发环境&#xff08;IDE&#xff09;是指提供广泛软件开发能力的软件应用程序。IDE 通常包括源代码编辑器、构建自动化工具和调试器。大多数现代 IDE 都配备了智能代码补全功能。在本文中&#xff0c;你将发现目前市场上最好的 Python IDE。 什么是 IDE&#xff1f; IDE…

为什么架构设计禁止IP直连?

什么是IP直连&#xff1f; IP直连指应用程序直接在代码中硬编码IP地址&#xff0c;比如&#xff0c;连接mysql数据库的数据库链接&#xff0c;如下的定义方式&#xff0c;就属于IP直连。 这种写法在开发环境中很常见&#xff0c;但是&#xff0c;在正式生产环境中&#xff0c;…

Linux shell编程学习笔记87:blkid命令——获取块设备信息

0 引言 在进行系统安全检测时&#xff0c;我们需要收集块设备的信息&#xff0c;这些可以通过blkid命令来获取。 1 blkid命令的安装 blkid命令是基于libblkid库的命令行工具&#xff0c;可以在大多数Linux发行版中使用。 如果你的Linux系统中没有安装blkid命令&#xff0c;…

Nginx处理并发连接

Nginx以其高效处理并发连接的能力而闻名&#xff0c;这主要归功于其事件驱动的架构和异步非阻塞I/O操作。 是Nginx处理并发连接的关键机制&#xff1a; 1. 事件驱动架构 Nginx采用事件驱动架构&#xff0c;这意味着它使用事件通知机制来响应网络事件&#xff0c;如新连接、读…

构建生产级的 RAG 系统

对 RAG 应用程序进行原型设计很容易&#xff0c;但要使其高性能、健壮且可扩展到大型知识语料库却很困难。 本指南包含各种提示和技巧&#xff0c;以提高 RAG 工作流程的性能。我们首先概述一些通用技术 - 它们按照简单到复杂的顺序进行排列。然后&#xff0c;我们将更深入地研…

【python实操】python小程序之测试报告

引言 python小程序之测试报告 文章目录 引言一、测试报告1.1 概念1.1.1 使用Pytest和Allure生成测试报告1.1.2 使用unittest和HTMLTestRunner生成测试报告1.1.3 总结 1.2 题目1.3 代码1.3 代码解释 二、思考 一、测试报告 1.1 概念 python生成测试报告&#xff0c;常用的方法包…

ELK之路第一步——Elasticsearch集群的搭建以及踩坑记录

elasticSearch集群 前言一、架构二、下载三、虚拟机相关设置3.1 创建es用户3.2 为建es用户赋权sudo3.3 更换es目录所属用户 四、Elasticsearch配置文件修改4.1 修改elasticsearch.yml4.2 修改jvm.options4.3 修改jdk路径 五、启动六、启动报错七、设置密码八、可视化界面cerebr…

支持向量机SVM简述

支持向量机SVM 1、概述 SVM全称是supported vector machine&#xff08;支持向量机&#xff09;&#xff0c;即寻找到一个超平面使样本分成两类&#xff0c;并且间隔最大。 SVM 模型有3种&#xff1a; 线性可分支持向量机&#xff1a;适用于训练数据线性可分。线性支持向量…

Ubuntu22.04环境搭建MQTT服务器

官网&#xff1a; https://mosquitto.org 1.引入库 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa2.升级安装工具 sudo apt-get update 3.安装 sudo apt-get install mosquitto 4.安装客户端 sudo apt-get install mosquitto-clients5.添加修改配置文件 进…

【使用Flask构建RESTful API】从零开始开发简单的Web服务!

使用Flask构建RESTful API&#xff1a;从零开始开发简单的Web服务 引言 随着Web应用程序的广泛使用&#xff0c;RESTful API已成为现代Web服务的核心技术之一。通过RESTful API&#xff0c;我们可以轻松地创建、读取、更新和删除&#xff08;CRUD&#xff09;数据&#xff0c…

力扣21 : 合并两个有序链表

链表style 描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 节点大小相同时&#xff0c;l1的节点在前 何解&#xff1f; 1&#xff0c;遍历两个链表&#xff0c;挨个比较节点大小 同时遍…

Python应用指南:利用高德地图API实现路径规划

高德路径规划API是一套基于HTTP协议的接口服务&#xff0c;旨在为开发者提供便捷的路径规划解决方案。该API支持多种出行方式&#xff0c;包括步行、公交和驾车&#xff0c;能够满足不同场景下的路径查询需求。通过调用这些API&#xff0c;用户可以获得从起点到终点的最优路径建…

Flink CDC系列之:理解学习Kubernetes模式

Flink CDC系列之&#xff1a;理解学习Kubernetes模式 准备会话模式启动会话集群设置 Flink CDC提交 Flink CDC Job Kubernetes 是一种流行的容器编排系统&#xff0c;用于自动化计算机应用程序的部署、扩展和管理。Flink 的原生 Kubernetes 集成允许您直接在正在运行的 Kuberne…

SOEM(EtherCAT)主站API梳理

1. 适配器管理 ec_adaptert * ec_find_adapters(void); 功能&#xff1a;查找并返回系统中所有可用的EtherCAT适配器的列表。返回值&#xff1a;指向适配器列表的指针。如果没有找到适配器&#xff0c;则返回NULL。void ec_free_adapters(ec_adaptert * adapter); 功能&#x…

Taro React-Native Android apk 打包

一、打包 react native 之打包 Android的apk - 创客未来 - 博客园 react native 打包成Android 的apk安装包有两种方式&#xff0c;第一种方式是利用 Android studio 打包这里就不接介绍了。第二种是利用 react native 自身项目打包 1、生成签名 再一个空文件夹打开CMD&…

DevOps和CI/CD以及在微服务架构中的作用

DevOps 和 CI/CD 是现代软件开发和运维中两个重要的概念,它们之间有紧密的联系,但也有不同的侧重点。以下是对这两个概念的详细介绍和比较。 1. DevOps 定义: DevOps 是一种文化、运动和实践,旨在通过促进开发(Development)和运维(Operations)团队之间的协作,提升软…

深度学习数学基础之偏导数

深度学习数学基础之偏导数 偏导数的详细解释与实例 定义 偏导数是多变量函数对其中一个变量的导数&#xff0c;同时固定其他变量。它是研究函数在多维空间内各个方向上局部变化性质的基本工具。对于函数 ( f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1​,x2​…

大数据之Kafka集群的安装部署

Kafka集群的安装部署是一个相对复杂但有序的过程&#xff0c;涉及多个步骤和配置。以下是一个详细的Kafka集群安装部署指南&#xff1a; 一、前期准备 硬件与软件要求 确保集群中的每台服务器都满足Kafka的硬件要求&#xff0c;包括CPU、内存和磁盘空间。安装Java运行时环境&a…

论文阅读(二十三):Squeeze-and-Excitation Networks

文章目录 1.介绍2.原理3.代码4.SE模块的应用 论文&#xff1a;Squeeze-and-Excitation Networks   论文链接&#xff1a;Squeeze-and-Excitation Networks   代码链接&#xff1a;Github 1.介绍 卷积算子使网络能够在每一层的局部感受野中融合空间&#xff08;spatial&…

视频智能分析平台LiteAIServer摄像机视频分析软件下载检测工业排污

在全球环境保护与可持续发展的大潮中&#xff0c;工业排污的有效监控与管理成为了衡量一个国家或地区绿色发展能力的重要指标。面对这一挑战&#xff0c;视频智能分析平台LiteAIServer以其创新的技术手段&#xff0c;为工业排污监管开辟了新路径&#xff0c;展现了科技在环保领…