刷题计划 day5 哈希表上

news2024/9/24 19:23:32

⚡刷题计划day5继续,可以点个免费的赞哦~

今天开启哈希表刷题专题,往期可看专栏,关注不迷路,

您的支持是我的最大动力🌹~

目录

⚡刷题计划day5继续,可以点个免费的赞哦~

今天开启哈希表刷题专题,往期可看专栏,关注不迷路,

您的支持是我的最大动力🌹~

哈希表理论基础简述

哈希表

哈希函数

哈希碰撞(哈希冲突):

题目一:242. 有效的字母异位词

题目二:383. 赎金信

题目三:349. 两个数组的交集


哈希表理论基础简述

哈希表

哈希表(hash table),又称散列表,它通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键 key ,则可以在 O(1) 时间内获取对应的值 value

哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。

元素查询效率对比:

例如要查询一个名字是否在这所学校里。

要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。

我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。

将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数

哈希函数

哈希函数的作用是将一个较大的输入空间映射到一个较小的输出空间。

将键通过哈希函数转换为数组索引。一个好的哈希函数应该能够将键分布到数组的各个位置,以减少冲突。

输入一个 key ,哈希函数的计算过程分为以下两步。

  1. 通过某种哈希算法 hash() 计算得到哈希值。

  2. 将哈希值对桶数量(数组长度)capacity 取模,从而获取该 key 对应的数组索引 index

index = hash(key) % capacity

通过取模后的值,比如hash(key) % capacity = 36 ,那么就会映射到了索引下标 36的位置,可结合图理解:

哈希碰撞(哈希冲突):

通常情况下哈希函数的输入空间远大于输出空间,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一桶索引。

如图所示,小李和小王都映射到了索引下标 1 的位置,这一现象叫做哈希碰撞

通常解决方法有:链地址法(每个数组位置存储一个链表,所有映射到该位置的键值对都存储在这个链表中)和开放寻址法(寻找空的数组位置来存储)。

题目一:242. 有效的字母异位词

leetcode:242. 有效的字母异位词

(https://leetcode.cn/problems/valid-anagram/description/)

暴力解法就不介绍了

数组就是一个简单哈希表,题目中字符串只有小写字符,那么就可以定义一个record数组,来记录字符串s里字符出现的次数。

新定义record数组大小26就可以,代表字符a到字符z的26个连续的ASCII值

在遍历字符串s1时,对于数组下标 s[i] - ‘a’(字母对应相对数值),出现一次record数组就加1;遍历完后record便记录了s1串每个字符出现的次数

接下来遍历字符串s2,对应下标出现一次,便将record数组对应减1;

两字符串都遍历完成后,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。

如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。

代码如下:

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];
​
        for(int i=0;i<s.length();i++){ // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
        record[s.charAt(i)-'a']++;
        }
        for (int i=0;i<t.length();i++){
            record[t.charAt(i)-'a']--;
        }
​
        for (int i=0;i<record.length;i++){
            if(record[i] !=0){ // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        return true;  // record数组所有元素都为零0,说明字符串s和t是字母异位词
    }
}

题目二:383. 赎金信

leetcode:383. 赎金信

(https://leetcode.cn/problems/ransom-note/description/)

因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。

和上一题思路差不多,区别点在于对于record数组的条件的判断,

record数组减后值如果<0,则说明减多了,不能全部包含。

一些同学可能想,用数组干啥,都用map完事了,其实在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
​
        int[] record = new int[26];
​
        for (int i=0;i<magazine.length();i++){
            record[magazine.charAt(i)-'a']++;
        }
        for (int i=0;i<ransomNote.length();i++){
            record[ransomNote.charAt(i)-'a']--;
        }
        for (int i=0;i<record.length;i++){
            if(record[i]<0){
                return false;
            }
        }
        return true;
​
    }
}

题目三:349. 两个数组的交集

leetcode:349. 两个数组的交集

(https://leetcode.cn/problems/intersection-of-two-arrays/description/)

此题输出结果唯一,所以结果需要去重

暴力的解法时间复杂度是O(n^2),使用哈希时间复杂度可以降低到 O(m+n)

大体思路:首先遍历num1,将其元素存入set1集合。再遍历num2,判断元素是否出现在set1集合中,如果存在,则加元素加入set2集合。之后再把数组转换为集合即可

代码如下

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> set1 = new HashSet<Integer>();
    Set<Integer> set2 = new HashSet<Integer>();
    //遍历 nums1
    for(int num1: nums1){
        set1.add(num1);
    }
    //遍历nums2,判断哈希表中是否存在该元素
    for(int num2: nums2) {
        if (set1.contains(num2)) {
            set2.add(num2);
        }
    }
​
        int[] arr = new int[set2.size()];
        int j=0;
        for(int i:set2){
            arr[j++] = i;
        }
        return arr;
    }
}

有没有发现,今天的三道题都是同类型的题,是不是思路都差不多。相同类型的题刷多了,你就会发现,最后其实在你脑子里记住的不是实现这道题的代码,而是解这道题的思路。

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

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

相关文章

多节点网络流量对比分析在业务性能分析中的应用

在现代企业网络环境中&#xff0c;网络流量分析已成为确保业务连续性和优化性能的关键工具。特别是多节点网络流量对比分析&#xff0c;通过对比不同节点间的流量&#xff0c;能有效发现潜在问题&#xff0c;提高网络运维效率。本文将探讨多节点网络流量对比分析在业务性能分析…

初识C++ · AVL树(1)

目录 前言&#xff1a; 1 AVL树的创建 2 部分成员函数 2.1 查找 2.2 中序遍历 2.3 插入 2.4 左旋转 2.5右旋转 前言&#xff1a; 上文&#xff0c;上上文提到了map set&#xff0c;二叉搜索树&#xff0c;其实都是为了近两文做铺垫的&#xff0c;虽然map的底层是红黑树…

Android statsd 埋点简析

源码基于&#xff1a;Android U 0. 前言 最近在研究 Android 自带的系统数据指标采集功能&#xff0c;框架依旧很严谨、完美&#xff0c;这里做个分享。 1. Android S 之后变化 stats 的代码从 framework 或 system/core 中转移到了 packages/modules/StatsD 目录中。 2. 框架…

结构拼图的艺术——组合模式(Python实现)

大家好&#xff0c;今天我们继续来讲结构型设计模式&#xff0c;上一期我们介绍了桥接模式&#xff0c;帮助大家理解了如何通过分离抽象部分和实现部分来实现代码的解耦。 今天&#xff0c;我们将介绍另一个非常实用的设计模式——组合模式&#xff0c;这个模式特别适合用于处…

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …

ili9341数据手册中的常用命令

一.设置液晶显示窗口 根据液晶屏的要求&#xff0c;在发送显示数据前&#xff0c;需要先设置显示窗口确定后面发送的像素数据的显示区域。下面的0x2A和0x2B分别对应的是y轴与x轴的命令。 /********** ILI934 命令 ********************************/ #define CMD_SetCoor…

keil调试SH79F7416

仿真器JET51A, 调试设置 选择器件 再次点击调试就一切正常啦

使用moco 完成挡板测试

这里写自定义目录标题 背景使用 moco 工具完成mock挡板功能1. 下载jar包2. 简单启动2.1 准备一个简单的json文件2.2 启动 高级运用同一接口的不同返回字段部分匹配 SONPath参数结构匹配 SON Struct JSON分模块 背景 mock测试&#xff08;挡板测试&#xff09;就是在测试过程中…

在jmeter中使用javascript脚本

工作上遇到一个压力测试的需求&#xff0c;需要测试几个考试相关的接口。其中有一个获取试题详情的接口&#xff0c;和一个提交答题信息的接口。后一个接口以上一接口的返回内容为参数&#xff0c;添加上用户的答案即可。jmeter提供了非常多的方式可以实现该需求&#xff0c;这…

保障企业数据主权:安全可控的爬虫工具与管理平台

摘要 在数据驱动的时代&#xff0c;企业对数据的需求日益增长&#xff0c;但如何在保障数据主权的前提下高效采集数据&#xff1f;本文深入探讨了选择安全可控爬虫工具与管理平台的重要性&#xff0c;分析了关键特性&#xff0c;并提出实用建议&#xff0c;助力企业维护数据安…

AWT200-HPLC-M载波通讯模块/智能网关

安科瑞AWT200-HPLC-M载波通讯模块适用于对数据实时性要求不高的系统&#xff0c;数据刷新速度大于1分钟&#xff0c;比如Acrel-5000能耗管理系统 电力线载波通讯模块AWT200-HPLC-M具备载波接收和网关通讯功能&#xff0c;支持三相载波数据采集&#xff0c;协议转换和数据上传平…

【Plotly-驯化】一文教你通过plotly画出动态可视化多变量分析:create_scatterplotmatrix

【Plotly-驯化】一文教你通过plotly画出动态可视化多变量分析&#xff1a;create_scatterplotmatrix 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &am…

windows USB 设备驱动开发- WinUSB 简介

WinUSB 是 Windows 随附的 USB 设备的通用驱动程序。WinUSB 包括&#xff1a; 内核模式驱动程序 (Winusb.sys)&#xff1b;公开 winusb.h 中所述的 WinUSB 函数的用户模式动态链接库 (Winusb.dll)。 借助这些函数&#xff0c;你可以使用用户模式软件管理 USB 设备&#xff1b;…

软件测试产教融合高质量发展论坛举办,开源网安受邀解读国家标准

近年来&#xff0c;在国家政策引导下&#xff0c;横跨教育体系内外的产教融合改革正在进行&#xff0c;推动了教育与产业深度融合、学校与企业协同发展。在软件安全领域&#xff0c;开源网安也一直走在产教融合发展的最前线&#xff0c;与各大高校建立了深度合作&#xff0c;双…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…

mysql字符类型字段设置默认值为当前时间

-- 2024-07-22 10:22:20 select (DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)); ALTER TABLE tablename MODIFY COLUNN CREATE_DATE varchar (23) DEFAULT(DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)) COMMENT "创建日期;

新校区,新视野——广州六中以太彩光打造智慧教育新高地

广州市第六中学总务处 林继青 广州市第六中学是拥有85年办学历史的著名市重点中学,也是广东省首批一级学校和国家级示范性高中。作为广州市首批智慧校园建设示范单位,广州第六中学在从化、花都新建校区的智慧校园建设中“破旧立新”,让先进的以太全光技术与学校新校区建设同频共…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞&#xff0c;编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码&#xff0c;从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

TikTok批量养号方法

想要在TikTok平台上批量养号&#xff0c;确保账号的健康与活跃度非常重要&#xff0c;不然等于白干。下面&#xff0c;我们就来详细探讨一下TikTok养号的几个关键步骤。 首先&#xff0c;新注册的账号必须严格遵守一机一号一IP的原则。随着TikTok平台在识别IP技术方面的不断进步…