代码随想录算法训练营第五天|哈希表理论基础,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接口对接的须知事项。 一、了…

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

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

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.复杂二维数组策略模式 …

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

在产品开发过程中&#xff0c;原型设计是一个非常重要的环节&#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…

【2023年收入最高的10种编程语言】

在过去的一年时间里&#xff08;2022 年 10 月 1 日到 2023 年 10 月 1 日&#xff09; &#xff0c;DevJobsScanner 分析了来自世界各地的超过 1000 万份开发工作机会&#xff0c;以了解市场以及最热门、薪酬最高的编程语言。值得注意的是&#xff0c;本项研究只关注了来自美国…

通过myBatis将sql语句返回的值自动包装成一个java对象(1)以及SqlSessionFactory

如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象&#xff0c;向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多&#xff0c;我们就需要new很多新的对象。这…

2024年第10届计算与人工智能国际会议(ICCAI 2024)即将召开

时间&#xff1a;2024年4月26-29日 地点&#xff1a;印度尼西亚巴厘岛 会议官网&#xff1a;ICCAI 2024|Bali, Indonesiahttps://www.iccai.net/index.html 2024年第十届计算与人工智能国际会议&#xff08;ICCAI 2024&#xff09;将于2024年4月26-29日在印度尼西亚巴厘岛举行…

推荐一款实用的免费开源局域网传输工具!轻松搭建网盘的神器!

本文小编给大家分享一款免费开源软件 Filebrowser&#xff0c;使用它可以轻松搭建属于你的个人网盘和网页版文件管理器。 它能做什么呢&#xff1f;想必大家也都用过百度网盘或阿里云盘之类的云存储服务&#xff0c;将自己的所有数据都存储在别人的服务器上&#xff0c;所谓的在…

【开源】基于JAVA的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

原型设计工具Axure RP结合内网穿透实现本地web页面公网访问协同办公

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

coala,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - coala。 Github地址&#xff1a;https://github.com/coala/coala/ 在现代软件开发中&#xff0c;代码质量和一致性是非常重要的。然而&#xff0c…

Docker 的工作原理及安装步骤【云原生】

文章目录 1. Docker 的工作原理2. Docker 与虚拟机3. Docker 架构4. 安装 Docker5. 配置镜像加速 1. Docker 的工作原理 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署会碰到一些问题&#xff1a; ① 依赖关系复杂&#xff0c;容易出现兼容性问题&#xff1…

本地搭建Oracle数据库结合内网穿透实现公网环境远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2…