代码随想录 Day 6 | 【哈希表理论基础】、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

基于Transformers库的BERT模型:一个文本情感分类的实例解析 简介 本文来讲述BERT应用的一个例子,采用预训练好的BERT模型来进行演示。BERT的库来源于Transformers,这是一个由PyTorch编写的库,其集成了多个NLP领域SOTA的模型,比如bert、gpt-2、transformer xl等,并且可以自由选择已经预训练好的模型参数,我们可以基于这些参数进行进一步的训练调试。 Part 1: 利用BERT基于特征的方式进行建模 1、任务与数... 阅读详情

一、哈希表理论基础

建议:了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。

什么时候想到用哈希法:当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,在做哈希表题目都要思考这句话。

文章讲解:代码随想录

1. 哈希表

what:哈希表是根据关键码的值而直接进行访问的数据结构。

比如数组就是一张哈希表,关键码就是数组的索引下标,通过下标直接访问数组中的元素。

when:当需要判断一个元素是否在集合中出现的时候,需要考虑哈希法。

2. 哈希函数

哈希函数将学生的名字映射到哈希表上为哈希表的索引,然后可以通过索引下标快速找到同学的名字。

哈希函数通过hashcode将名字转化为数值,有特定的编码格式。

如果hashcode映射得到的数值大于哈希表的大小了,则对其取模;

如果学生数量超过哈希表的大小了,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表同一个索引下标的位置。--> 哈希碰撞

3. 哈希碰撞

        不同对象映射到了同一索引位置,称为哈希碰撞。

        解决方法:拉链法、线性探测法。

(1)拉链法:将冲突的元素存放在链表当中,就可以通过索引找到。

        拉链法就是寻找合适内存大小的数组,这样就不会因为数组内存空值多而浪费内存空间,也不会因为链表过长而导致查找浪费时间。

(2)线性探测法

        使用线性探测法必须保证tablesize大于datasize,利用哈希表的空位来解决哈希碰撞。例如两个对象被映射到了同一位置,那么需要寻找该位置的下一个空位置来存放冲突数据。

4. 常见的三种哈希表结构

当想要使用哈希表解决问题时,一般选用以下三种数据结构:

(1)数组

(2)集合(set)

(3)映射(map)

二、242.有效的字母异位词

建议: 这道题目,可以感受到 数组 用来做哈希表 给我们带来的遍历之处。

题目链接/文章讲解/视频讲解: 代码随想录

1. 看到这道题的第一想法

        分别遍历两个字符串,然后对每个字符串中的元素进行计数,如果两个字符串的每个元素计数相等,那么就是有效的字母异位词,返回true,否则返回false。

2. 看完代码随想录的想法

(1)方法1:

        A. 因为字母一共最多有26个,所以直接定义一个长度为26的数组,用于每个字母计数;

        B. 分别遍历s、t字符串:通过ord函数返回字符串中对应字符的ASCII码,并与字符"a"的ASCII码做减法运算,得到的数值正好对应26个字母的顺序下标,然后每循环一次,就为对应的字母出现的频数增加1。

for i in s:
    record[ord(i)-ord('a')] += 1

         接下来,遍历t字符串,只需要在遍历完s字符串的record数组基础上,遍历一遍t字符串,并向对应的字母位置进行-1操作。

        C. 最后,对record数组进行遍历,一旦遇到数组元素(频数)不等于0的,直接返回False;而循环完成后发现record全部为0,则说明s和t是有效的字母异位词,返回True即可。

(2)方法2:

        引入collections中的Counter函数:Counter函数是对用于统计可哈希对象(例如列表、元组、字符串等)的元素出现的次数。注意:最后返回的是字典K-V形式。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import Counter
        a=Counter(s)
        b=Counter(t)
        return a==b

3. 实现过程中遇到的困难及解决 

(1)不会定义数组,不会将数组初始化全部为0;

(2)不清楚如何对每个字符串循环它的元素并为每个元素进行计数:这里用到了ASCII码,不需要去记住26个字母的ASCII码,只需要直到26个字母的ASCII码是连续递增,相隔为1的,因此只需要用ord函数取ASCII码与a的ASCII码相减,刚好得到26个字母的索引下标[0,25]。

(3)这道题目的方法1 巧妙地将暴力解法双层嵌套循环结构,改成两个循环结构,无嵌套,时间复杂度为O(n)。

三、349. 两个数组的交集

建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。

题目链接/文章讲解/视频讲解:代码随想录

1. 看到题目的第一想法

        分别对数组里面的数字出现的频数计数,然后取出频数在两个数组都不为0的数字,将其放到一个新数组进行输出。

2. 看完代码随想录的想法

(1)首先定义两个数组用于对数组里面的数字出现的频数进行计数,分别记为record1和record2,并且他们的长度根据nums1和nums2的最大上限定义;然后定义一个空数组,用于存放最终结果。

(2)分别对两个数组中的数字进行计数:

for i in range(len(nums)):
    record1[nums1[i]]+=1

(3)频数统计完毕后,得到的数组应该是record的下标正是统计的数字,而它的值就是频数;

(4)关键的一步:要同时遍历record1和record2,不能嵌套循环,否则无法做到同时遍历这两个数组,那么只能下标统一从0开始一直到1001,同时遍历两个数组,让对应的值相乘,只要不为0,说明这个数字在两个数组中均出现过,并且出现过几次不重要,最后只返回一次这个数字即可;并将这个数字添加至结果集合中。

(5)最终要返回这个集合。

四、202. 快乐数

建议:这道题目也是set的应用,其实和上一题差不多,就是套在快乐数一个壳子

题目链接/文章讲解:代码随想录 

1. 看到这道题的第一想法

        首先要将输入的n拆分成多个数字存放进数组中,也就是将不同位的数字转化为单个数字组成的数组;然后对数组每个数字平方后进行循环加和,直到同样的加和出现超过一次,说明陷入了死循环,直接返回False;否则一直到加和对于1,说明是快乐数,返回True。

2. 看完代码随想录的想法

(1)定义一个空数组record,用于存放平方后的加和;

(2)因为题目中说可能会存在无限循环(当加和sum出现超过一次时,就说明进入了死循环),因此以输入的n不在所用于记录的数组record中为进入循环的条件;

(3)将输入的数字存入record中,然后将输入的数字n转化为string类型,便于后续对它的每个字符进行遍历;

(4)初始化加和sum = 0;

(5)遍历数字n转化后的字符串,在循环中将字符串用int函数强制转化为整型用于进行平方和运算;

(6)对每个sum进行判断,如果等于1则直接输出true;如果一直循环最后退出sum一直不为1的话说明不是快乐数,输出False。

五、1. 两数之和

建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。

建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。

题目链接/文章讲解/视频讲解:代码随想录

1. 看到题目的第一想法

        暴力法:遍历nums数组,并在第一层循环的基础上,嵌套一次range(i+1,len(nums))的循环,然后找到对应下标的元素,如果相加等于target,则返回下标数组。

        特别注意:第二层循环的起点是i+1, 而不是1!!

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]==target:
                    return [i,j]

2. 看完代码随想录的想法

(1)定义一个集合record = set()

(2)利用enumerate函数,将nums转化为组合为一个索引序列,同时列出数据和数据下标;然后对它的index和value进行遍历,如果target-value已经存在于集合中,那么就返回他俩的下标,如果没有存在于集合,则将值添加进集合。

3. 实现过程中遇到的问题及解决

(1)Python3集合:

        A. 定义:集合(set)是一个无序的不重复元素序列。集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。

        B. 集合创建:可以使用set()函数或者大括号{}(中间元素用逗号分开)。

特别注意:创建空集合只能使用set()函数,不可以用大括号,大括号是用于创建空字典!!

        C.判断元素在集合存在:

(2)Counter()函数,统计可迭代对象中各元素重复的次数,需要from collections import Counter,返回一个Counter对象,可以直接dict构建字典,也可以for k,v in Counter来遍历访问。

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念 摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字) 阅读详情

相关推荐

飞腾X100芯片GPU状态查询

本文档对在linux系统下查看X100芯片GPU状态信息进行说明,可以帮助大家了解芯片的实时工作状态。

乌拉大喵喵 2815

【代码随想录】Day6 哈希表理论基础 242.有效的字母异位词 ,349. 两个数组的交集 202. 快乐数 1. 两数之和

新的一部分-哈希表,哈希表之前做题相对比较熟练希望能快速复习今天主要详细理解了C++中哈希表 unordered_set unordered_map的基础使用以及快乐数算法。DAY 6 Finished 撒花~

SuperMao2016的博客 1948

PLDM入门(七):FRU Data Format

每个字段为TLV(Type-Length-Value)格式,具体类型、长度范围和值定义需参考。通过条件过滤(记录句柄、类型、字段类型等)分块获取FRU记录数据(可选功能)。整个FRU数据表由多个FRU记录数据块组成,每个数据块对应表2的结构(即包含。决定,每个字段按顺序排列(Type→Length→Value)通过分块传输方式写入FRU记录表数据(需终端支持写入操作)。(文档未提供表5内容,需结合标准文档完整版)。、字段数量、编码类型及具体字段的TLV数据)。无请求数据(空请求)。

weixin_44032634的博客 1762

代码随想录Day6哈希表理论基础 242.有效的字母异位词349. 两个数组的交集202. 快乐数 1. 两数之和

当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。那么再来看一下map ,在map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的。如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。

weixin_55956746的博客 2839

视觉定位避坑指南:基于双mark点的坐标转换常见错误排查

本文详细解析了工业视觉项目中基于双mark点的坐标转换常见错误及排查方法,涵盖旋转矩阵构建、坐标系原点选择、图像预处理优化等关键环节。通过实战案例和代码示例,帮助工程师避免定位偏差,提升系统精度,特别适用于自动化检测和精密制造场景。

7z8x2c4v6b9的博客 167

MarkDown简介(深度解析MarkDown用法)

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I...

酷酷的旭 7341

代码随想录Day6 | 哈希表理论基础 242.有效的字母异位词349. 两个数组的交集 202. 快乐数1. 两数之和

Day6

sRiddle的博客 1225

STM32N6:MCU+NPU架构如何重塑边缘AI部署新范式

STM32N6作为业界首款MCU+NPU架构的通用微控制器,通过集成600 GOPS算力的NPU与800MHz Cortex-M55内核,实现了边缘AI部署的革命性突破。该方案在工业视觉和智能家居等场景中,以超低功耗和成本提供实时AI处理能力,性能较传统MCU提升超100倍,重塑了边缘智能设备的设计范式。

g8f9d0s1a2的博客 1292

代码随想录算法训练营Day6 | 哈希表理论基础 LeetCode 242. 有效的字母异位词 349.两个数组的交集 202. 快乐数 1.两数之和

哈希表,Hash table,也称散列表,是根据关键码的值而直接访问的数据结构。如,数组即为一张哈希表。哈希表,常用于:快速判断一个元素是否出现在集合里。,即将不同数据格式转化为不同数值,映射为哈希表上的索引数字。当存入内容数量大于哈希表大小时,若发生不同内容映射于哈希表同一索引下标的位置,即发生。和拉链法,将发生冲突的元素存储在同一索引的链表中;线性探测法,需要哈希表大小存入内容数量,发生冲突时,寻找哈希表中下一个空位来进行存放。:数组,set(集合),map(映射)

weixin_65053787的博客 1913

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

基于ZYNQ的HP总线与DDR交互:实现PL与PS高效数据传输的完整指南

本文将深入探讨如何通过AXI HP总线实现PL与PS的DDR交互,结合代码示例、硬件配置与创新优化,助力开发者掌握这一关键技术。ZYNQ内部通过AXI HP接口直接连接PL与DDR控制器,PL通过AXI协议发送读写请求,绕过PS的CPU直接操作DDR。通过AXI HP总线实现PL与PS的DDR交互,开发者可充分发挥ZYNQ异构架构的优势。在Xilinx ZYNQ系列芯片中,PS(Processing System)与PL(Programmable Logic)的协同设计是其核心优势。

QQ_778132974的博客 1223

代码随想录算法训练营Day6 | 哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

训练营第六天:哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

jiabao0520的博客 1645

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2981

代码随想录Day6 哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

weixin_46620779的博客 3436

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

代码随想录刷题day6丨哈希表理论基础 ,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数, 1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

m0_75195038的博客 1107

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

代码随想录 Day6 哈希表 哈希表理论基础, 242.有效的字母异位词, 349. 两个数组的交集,202. 快乐数,1. 两数之和

unorder_set的底层实现是哈希表,所以说在查找元素和增删的时候效率都是非常高的。2. unorder_set 可以直接帮助去重,这个地方也用到它的底层原理,unordered_set的底层是哈希表所以说这样在查找一个元素的时候O(1)哈希法中有vector,set,map,因为我们需要保存元素值和下标值所以采用map,因为我们需要检查map中有没有存在的相应的元素值即key代表元素值。4.set的元素输入的方式是.insert(x),vector的元素输入的方式是.push_back(x)

weixin_61057535的博客 1228

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

代码随想录算法训练营day6| 哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

day5休息。

u010793461的博客 1158

代码随想录day6|哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

代码随想录day6

xccxynb的博客 1149

代码随想录算法营Day6 | 哈希表理论基础, 242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数, 1. 两数之和

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

cestyvwen的博客 783

代码随想录Day6 | 哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

std::map也是一样的道理。std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。**再遍历 字符串s的时候,当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。

m0_73617263的博客 875

Studying-代码随想录训练营day6| 哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

哈希表学习:哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

yachihaoteng的博客 1474

# 代码随想录Day6 |哈希表理论基础|242.有效的字母异位词|349.两个数组的交集|202.快乐数|1.两数之和

初步思路:计算两个数组中每个数字出现的频率,然后两个频率哈希表相减,nums1减去nums2的哈希表,如果哈希表中的某个差值不等于num1的原频率,说明是交集,返回这个数。终于把打卡补上了,今天的任务也大致完成了,题目有一些多,每天需要花三四个小时,一定要坚持下来,不要再漏卡了,不然补起来很吃力。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。假如target=9,找到一个3,需要查看3前后的哈希表中有没有6.你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

爱因斯小柚的博客 1021

代码随想录算法训练营Day6 | 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和 | Python | 个人记录向

哈希表:哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和。

Python基本算法 1224

代码随想录day6 | 哈希表理论基础 leetcode242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。解题思想:map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)。快乐数的定义指出,如果对一个数重复进行“将每个数字替换为每个数字的平方和”的操作,最终结果要么是 1(这是一个快乐数),要么是进入。在随后的迭代中,如果再次遇到一个已经在 record 集合中的数,这意味着我们已经回到了之前某个步骤的数,即进入了循环。

ajbsyuinbsn的博客 775

Carl代码随想录算法训练营-Day 6-哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

本文是参加算法学习的日常记录,分析总结了哈希表基础理论的一些要点,详细阐述了四道基础的哈希表leetcode算法题目(有效字母异位词、两个数组的交集、快乐数、两数之和)的解题思路,并给出了对应的Java代码实现。

BuleFACE_Zhang的博客 1036

代码随想录算法训练营Day6|● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

我们找这个x有没有在数组里出现过不就行了吗,我的天,我觉得这个思想真的非常的巧妙,我瞬间恍然大悟,找他有没有出现过,并且还要知道他的下标,这不就是对应着map里的key和val吗,我瞬间就知道怎么写了,当然就是先定义一个map,遍历数组在遍历到当前元素的时候,定义一个x和上面的操作一样,然后判断它有没有出现过,如果出现了,就直接返回他的下标和当前元素的下标,没有就将当前的元素值和下标加入到map中,注意这里加入的不是x,来看具体代码的实现。今天学了新的东西——哈希法,这个方法真的是好用,怎么好用呢?

2401_82757749的博客 990
上一篇: 代码随想录 Day 4 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 、【链表】总结
下一篇: 代码随想录 Day 7 | 454.四数相加II、383. 赎金、15. 三数之和 、18. 四数之和
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值