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

系列文章目录

代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素
代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
代码随想录算法训练营第三天|链表理论基础,203.移除链表元素,707.设计链表,206.反转链表
代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结

文章目录

  • 系列文章目录
  • 哈希表理论基础
    • (一)哈希表的概念
    • (二)哈希函数
    • (三)哈希碰撞
    • (四)总结
  • 242.有效的字母异位词
  • 349. 两个数组的交集
  • 202. 快乐数
  • 1. 两数之和


哈希表理论基础

当遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

(一)哈希表的概念

  1. 哈希表的含义:根据关键码的值而直接进行访问的数据结构;
  2. 数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素;
  3. 哈希表的作用:一般哈希表用来快速判断一个元素是否出现集合里;
  4. 枚举查询的时间复杂度是O(n),但使用哈希表的时间复杂度为O(1)。

(二)哈希函数

哈希函数通过hashCode的特定编码方式将其他数据格式转化为不同的数值,从而把需要存储的内容映射为哈希表上的索引数字。
在这里插入图片描述

(三)哈希碰撞

哈希碰撞的现象:由于内容数比哈希表数多,导致不同内容同时映射到哈希表同一个索引下标的情况;
哈希碰撞的两种解决方法:拉链法、线性探测法;

  1. 拉链法:发生冲突的元素都被存储在链表中
    在这里插入图片描述拉链法需要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内存,也不会因为链表太长而在查找上浪费太多时间。

  2. 线性探测法:
    线性探测法要保证tableSize大于dataSize,依靠哈希表中的空位来解决碰撞问题。
    冲突的位置,放了小李,那么就向下找一个空位放置小王的信息:
    在这里插入图片描述

(四)总结

  • 使用哈希法解决问题时,一般会选择如下三种数据结构:数组、set (集合)、map(映射);
    • 数组:哈希值比较小,范围也比较小
    • set:数值比较大
    • map:key,value
  • 哈希法是牺牲空间换取时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找;
  • 做题时遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法。

242.有效的字母异位词

题目链接: 242.有效的字母异位词
题目内容: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。(若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词)
视频讲解:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词

核心思路:定义一个数组叫做record用于遍历增加记录字符串s里字符出现的次数,然后遍历减少记录字符串t里字符出现的次数,最后判断record中的记录是否为0。

class Solution:def isAnagram(self, s: str, t: str) -> bool:#创建一个长度为26的新数组record = [0] * 26#遍历字符串sfor i in s:record[ord(i)-ord('a')]+=1  #ord()返回字符串的ASCII数值#遍历字符串tfor i in t:record[ord(i)-ord('a')]-=1#查看数组是否为0for i in record:if i != 0:return Falsereturn True

349. 两个数组的交集

题目链接: 349.两个数组的交集
题目内容: 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
视频讲解:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集

用数组做:
初步思路为创建一个hash数组,然后将nums1的元素加进去,遍历nums2的元素,在hash数组中出现了,就存到结果中,但是在python中这样实现最后出来的结果不唯一。
看了代码随想录的方法,创建了两个哈希数组,分别遍历nums1和nums2的元素,如果两个哈希数组对应取值的乘积大于0,说明两个哈希数组里都有该值,可以输出,此时的输出结果唯一,满足题意。

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:count1=[0]*1005count2=[0]*1005record=[]for i in nums1:count1[i]+=1for i in nums2:count2[i]+=1for k in range(1005):if count1[k]*count2[k]>0:record.append(k)return record

用set做:

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:return list(set(nums1) & set(nums2))

用set+字典做:
主要思路在于用哈希表存储nums1的元素,判断nums2的元素有没有出现在哈希表中,如果出现了,就作为输出结果,由于集合用于保存不重复的元素,所以可以确保唯一。

class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:#使用哈希表存储一个数组中的所有元素table={}for num in nums1:table[num]=table.get(num,0)+1#使用集合存储结果result=set()for num in nums2:if num in table:result.add(num)del table[num]return list(result)

202. 快乐数

题目链接: 202.快乐数
题目内容: 编写一个算法来判断一个数 n 是不是快乐数。(快乐数定义:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是无限循环 但始终变不到 1。如果这个过程结果为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false)

用数组做:
核心思想:使用哈希法判断某一次求和的结果是否重复出现,如果重复了就是return false, 否则一直找到和为1为止。

class Solution:def isHappy(self, n: int) -> bool:record=[]while n not in record:record.append(n)new_num=0n_str=str(n)for i in n_str:new_num+=int(i)**2if new_num ==1:return Trueelse:n=new_numreturn False

用集合做:
核心思想与用数组做类似

class Solution:def isHappy(self, n: int) -> bool:record=set()while n not in record:record.add(n)sum=0n_str=str(n)for i in n_str:sum+=int(i)**2if sum == 1:return Trueelse:n=sumreturn False

1. 两数之和

题目链接: 1.两数之和
题目内容: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
视频讲解:梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!

核心思想:需要一个集合来存放遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是是否出现在这个集合。
使用字典:

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:records=dict()for index,value in enumerate(nums):if target-value in records:return [records[target-value],index]records[value]=index          return []

使用集合:

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:records=set()for index,value in enumerate(nums):if target-value in records:return [nums.index(target-value),index]records.add(value)        return []

双指针法:
核心思想:对数组排序之后,采用缩小区间的方式

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:nums_sorted=sorted(nums)left=0right=len(nums_sorted)-1while left<right:current_sum=nums_sorted[left]+nums_sorted[right]if current_sum==target:left_index=nums.index(nums_sorted[left])right_index=nums.index(nums_sorted[right])if left_index == right_index:right_index=nums[left_index+1:].index(nums_sorted[right])+left_index+1return [left_index,right_index]elif current_sum<target:left += 1else:right -= 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]

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

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

相关文章

【Elsevier】中科院分区升至1区TOP,录用率50%, 代表作神刊!

发表说 截图来源&#xff1a;LetPub 01 期刊概况 Computers & Industrial Engineering 【出版社】Elsevier 【ISSN】0360-8352 【检索情况】SCI&EI双检 【WOS收录年份】1976年 【出刊频率】月刊&#xff0c;最新一期Volume 188 &#xff0c;In progress (February…

arcgis javascript api4.x以basetilelayer方式加载arcgis发布的栅格切片服务

需求&#xff1a; 以arcgis js api的basetilelayer加载arcgis发布的栅格切片服务 效果图&#xff1a; 其中和tileinfo和lods&#xff0c;这样获取&#xff1a; https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/?fpjson urltemplate&#xff1a; …

TortoiseGit 2.15.0.0 安装与配置(图文详细教程)

TortoiseGit的安装与配置 TortoiseGit是Tortoise为Git提供的版本可视化工具&#xff0c;简化了记忆Git命令行的过程&#xff0c;将命令行可视化。 确保自己电脑中已经下载好了git 官网下载TortoiseGit Download – TortoiseGit – Windows Shell Interface to Git 选择64-bi…

电商平台api接口对接须知

随着互联网的发展和普及&#xff0c;电商平台已成为人们日常生活中不可或缺的一部分。而为了保证电商平台的正常运行&#xff0c;平台与开发者之间需要进行数据交互&#xff0c;这便涉及到了电商平台API接口对接的问题。本文将详细介绍电商平台API接口对接的须知事项。 一、了…

【Linux】如何检查Linux用户是否具有sudo权限

问题背景或前提知识 在Linux系统中&#xff0c;sudo&#xff08;superuser do&#xff09;是一个重要的命令&#xff0c;它允许普通用户以系统管理员的身份执行命令。了解用户是否拥有sudo权限对于系统管理和安全性来说是非常重要的。 技术名词解释 sudo&#xff1a;一种程序…

springboot摄影跟拍预定管理系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

ZZULIOJ 1106: 回文数(函数专题)

题目描述 一个正整数&#xff0c;如果从左向 右读&#xff08;称之为正序数&#xff09;和从右向左读&#xff08;称之为倒序数&#xff09;是一样的&#xff0c;这样的数就叫回文数。输入两个整数m和n&#xff08;m<n)&#xff0c;输出区间[m&#xff0c;n]之间的回文数。…

openssl3.2 - 官方demo学习 - sconnect.c

文章目录 openssl3.2 - 官方demo学习 - sconnect.c概述笔记END openssl3.2 - 官方demo学习 - sconnect.c 概述 TLS客户端 - 使用根证书, 非阻塞, 向服务器要东西. 笔记 开始一个新demo学习时, 要从头配置包含路径, 麻烦. 直接拷贝上一个实现工程, 换掉实现.c方便一些. 换的…

中国泡菜市场供需与投资预测研究报告(2024版)

内容简介&#xff1a; 泡菜主要是靠乳酸菌的发酵生成大量乳酸而不是靠盐的渗透压来抑制腐败微生物的。泡菜使用低浓度的盐水&#xff0c;或用少量食盐来腌渍各种鲜嫩的蔬菜&#xff0c;再经乳酸菌发酵&#xff0c;制成一种带酸味的腌制品&#xff0c;只要乳酸含量达到一定的浓…

LeetCode 2645.构造有效字符串的最少插入数:O(n) + O(1)

【LetMeFly】2645.构造有效字符串的最少插入数&#xff1a;O(n) O(1) 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-additions-to-make-valid-string/ 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 "a"、"b" 或 "…

设计模式之多线程分工模式---Worker Thread模式

系列文章目录 设计模式之避免共享的设计模式Immutability&#xff08;不变性&#xff09;模式 设计模式之并发特定场景下的设计模式 Two-phase Termination&#xff08;两阶段终止&#xff09;模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…

Javascript 地狱级的if else / switch case该如何优化?

目录 问题 一、7大策略优化 1.单个if语句优化 2.if/else语句优化 3.多条件判断 4.多个 if else 嵌套优化策略 问题场景 如何优化 1.使用卫语句 2. try catch优化 3. 可选链 optional chaining 5.Map优化 场景实战 6.策略模式优化 7.复杂二维数组策略模式 …

CycleGAN(Cycle-Consistent Generative Adversarial Network)

CycleGAN&#xff08;Cycle-Consistent Generative Adversarial Network&#xff09;是一种用于图像到图像转换的深度学习模型。其主要目标是学习两个域之间的映射&#xff0c;例如将马的图像转换为斑马的图像&#xff0c;而无需配对的训练数据。以下是CycleGAN图像到图像转换的…

简单易用的快速原型软件终于被我找到了!

在产品开发过程中&#xff0c;原型设计是一个非常重要的环节&#xff0c;它不仅有助于团队之间的合作和沟通&#xff0c;而且是产品是否符合用户体验的关键。在本文中&#xff0c;我们将推荐一些有用的原型设计工具 即时设计 即时设计是一种在线原型设计工具。你可以用它在线…

UITextField设置

UITextField设置 //初始化textfield并设置位置及大小UITextField *text [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];//设置边框样式&#xff0c;只有设置了才会显示边框样式 text.borderStyle UITextBorderStyleRoundedRect;typedef enum {UITextBord…

基于云平台技术的XCALL的浅谈

基于云平台技术的XCALL&#xff08;eXpandable Call&#xff09;创新主要体现在以下几个方面&#xff1a; 可扩展性&#xff1a;XCALL利用云平台的可扩展性&#xff0c;能够处理大量并发通话&#xff0c;满足各种规模的业务需求。随着用户数量的增长&#xff0c;云平台可以动态…

RPA与通知机器人的完美结合

写在前面 在现代快节奏的工作环境中&#xff0c;我们经常会面临多个任务同时进行的情况&#xff0c;你还在为时间不够用、忙碌而惆怅吗&#xff1f;你还在为时刻盯着电脑流程而烦恼吗&#xff1f;你还在为及时收不到自己的自动化任务进度而焦躁吗&#xff1f;别担心&#xff0…

目标检测数据集 - 行人检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;行人检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下行人检测项目&#xff0c;以及作为…

中国关心下一代工作委员会健康体育发展中心美育舞蹈考官一王雪

王雪—— 《中国关心下一代工作委员会》健康体育发展中心、美育舞蹈考官、评委 北京舞蹈学院舞蹈编导 朝阳区小红门地区文化艺术-领头人 中国舞舞蹈家协会会员 2019年7月7日中国观网第六届京津冀淑女 2021年辅导学生登上央视春晚 《听我说》 2023年4月22日带学生参加万人…

Vue 3,element table表格动态添加

el-table实现表格动态新增/插入/删除表格行&#xff0c;可编辑单元格 效果图 代码实现 <template><el-table :data"formDate.scoreList4" style"width:100%;height: 96%;" stripe show-summary:summary-method"calculateSummary":he…