数据结构02附录02:哈希表[C++]

图源:文心一言

上机题目练习整理~🥝🥝

本篇作为线性表的代码补充,每道题提供了优解和暴力解算法,供小伙伴们参考~🥝🥝

  • 第1版:在力扣新手村刷题的记录,优解是Bard老师提供的建议~🧩🧩

编辑:梅头脑🌸

题目:1512. 好数对的数目 - 力扣(LeetCode)


📇目录

📇目录

🧵好数对的题目

🧩题目

🌰时间复杂度更好 

🌰空间复杂度更好

🔚结语


🧵好数对的题目

🧩题目

给你一个整数数组 nums 。

如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

返回好数对的数目。

示例 1:

输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始

示例 2:

输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对

示例 3:

输入:nums = [1,2,3]
输出:0

🌰时间复杂度更好 

📇优解思路

  • 算法思想:
    • 使用哈希表 hash 存储元素出现的次数。
    • 遍历哈希表,统计每个元素出现的次数大于 1 的情况。
    • 对于每个出现的次数大于 1 的元素,其好数对的数目为 出现的次数 - 1
  • 时间复杂度:O(n),其中n是数组的长度,因为遍历1遍数组。
  • 空间复杂度:O(n),其中n是数组的长度,因为哈希表占用的长度为n。

 ⌨️优解代码

class Solution {
public:int numIdenticalPairs(vector<int>& nums) {int count = 0;unordered_map<int, int> hash;      // 声明一个哈希表 hash,键为 int 型,值为 int 型for (int num : nums) {             // 遍历数组 nums 中的每个元素 numhash[num]++;                   // 将元素 num 在哈希表 hash 中出现的次数加 1if (hash[num] > 1) {           // 如果元素 num 出现的次数大于 1,则说明存在好数对count += hash[num] - 1;    // 将好数对的数目加 hash[num] - 1}}return count;}
};

 ⌨️哈希表解释

哈希表简介

哈希表是一种以键值对存储数据的抽象数据结构。它利用哈希函数将键映射到一个索引,从而快速查找键值对。

哈希表的基本操作

  • 插入:将键值对插入哈希表。
  • 查找:根据键查找哈希表中的值。
  • 删除:根据键删除哈希表中的键值对。

哈希表的特点

  • 查找速度快:哈希表的平均查找时间复杂度为 O(1)。
  • 空间利用率高:哈希表可以有效利用空间,减少内存浪费。
  • 哈希冲突:当不同的键映射到同一个索引时,就会发生哈希冲突。

哈希表的详细介绍,可以参考 大佬 嗯行家啊 的博文:

🌸一文看懂哈希表并学会使用C++ STL 中的哈希表_哈希表end函数-CSDN博客

 ⌨️代码运行

假设数组 nums[1, 2, 3, 1, 1, 3]

  1. 首先,我们将数组中的每个元素插入哈希表 hash 中。这里应该会经过取余运算,即1%6=1,2%6=2,3%6=3。

  1. 然后,我们遍历哈希表 hash
  • 对于元素 1hash[1] = 3,说明元素 1 出现了 3 次。因此,存在 2 个好数对,下标分别为 (0, 3) 和 (0, 4)。
  • 对于元素 2hash[2] = 1,说明元素 2 只出现了一次,因此不存在好数对。
  • 对于元素 3hash[3] = 2,说明元素 3 出现了 2 次。因此,存在 1 个好数对,下标分别为 (2, 5)。
  1. 最后,我们将所有好数对的数目加起来,得到最终结果 4

🌰空间复杂度更好

📇暴力解思路

  • 算法思想:
    • 2层for循环,外层为数组下标 i 的循环,内层为数组下标 j 的循环;
    • 当nums[i] == nums[j]时,增加好数对的记录;
  • 时间复杂度:O(n2),因为使用了2层循环。
  • 空间复杂度:O(1),只有count占用了位置。

⌨️暴力解代码

class Solution {
public:int numIdenticalPairs(vector<int>& nums) {int length = nums.size();int count = 0;for (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {if (nums[i] == nums[j])count++;}}return count;}
};

🔚结语

2013年有一道题目的暴力解也可以用哈希表,因为格式粘过来总是有问题,所以干脆发原文链接:🌸数据结构02附录01:顺序表考研习题[C++]-CSDN博客~🥝🥝

不过,附录01这篇博文有的答案写得不太好,最近正在绞尽脑汁准备修改中——

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶‍🌫️😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟

数据结构_梅头脑_的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_42789937/category_12262100.html?spm=1001.2014.3001.5482

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

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

相关文章

目标检测-One Stage-EfficientDet

文章目录 前言一、EfficientNetEfficientNet-B0 baselineMBConv 参数优化EfficientNet B0-B7 参数 二、EfficientDetBiFPN复合缩放方法 总结 前言 EfficientDet是google在2019年11月发表的一个目标检测算法系列&#xff0c;其提出的背景是&#xff1a;之前很多研究致力于开发更…

探索 Flutter 的 Provider:介绍与用法

引言 在 Flutter 应用开发中&#xff0c;状态管理始终是一个核心话题。随着 Flutter 的不断发展&#xff0c;各种状态管理方案应运而生。Provider&#xff0c;作为一个轻量级且高效的状态管理库&#xff0c;在社区中获得了广泛的认可和使用。本文将深入探讨 Provider 的最新特…

自动化创建ETX用户帐号

在芯片设计行业&#xff0c;ETX是常见的远程访问环境。用户在通过ETX访问远程环境前必须首先加入ETX系统&#xff0c;然后通过profile分配相关的环境的访问权限。 通常这些操作在ETX WEB页面手工操作&#xff0c;如果我们期望实现用户帐号注册全自动化&#xff0c;就需要将以上…

SpringBoot整合Mybatis框架实现多数据源的静态数据源和动态数据源配置落地

Mybatis是什么 Mybatis是一个基于JDBC实现的,支持普通 SQL 查询、存储过程和高级映射的优秀持久层框架,去掉了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。 Mybatis主要思想是将程序中大量的 SQL 语句剥离出来,配置在配置文件中,以实现 SQL 的灵活配置。…

一文搞懂Git版本工具常用的操作命令

简述 Git是一个分布式的版本控制工具,其在使用上要比SVN等版本控制工具稍显复杂。为了便于理解,本文通过图文方式详细介绍Git的使用,以便于快速掌握Git。Git涉及的主要概念和命令如图所示。理解上述概念后,基本可以使用Git完成日常开发工作。关于Git的介绍以及常用命令在之前的…

代码随想录算法训练营第16天 |(二叉树3 104.二叉树的最大深度 559. N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

二叉树part03 104.二叉树的最大深度 &#xff08;优先掌握递归&#xff09;&#xff08;昨天用层序迭代做过解题思路 559. N叉树的最大深度111.二叉树的最小深度 &#xff08;优先掌握递归&#xff09;&#xff08;昨天用层序迭代做过解题思路 222.完全二叉树的节点个数&#x…

人工智能在银行支付领域的应用场景与发展建议

人工智能在银行支付领域的应用场景与发展建议 随着科技的不断进步和金融行业的发展&#xff0c;人工智能&#xff08;AI&#xff09;在银行支付领域的应用正日益广泛。AI技术可以通过数据分析和智能算法&#xff0c;提升支付系统的效率、安全性和用户体验。以下是人工智能在银…

易经占卜中的人工智能思想:先随机有一个答案不管正确与否 等后期积累经验再完善,答案就会越来越准确好用

《易经》&#xff1a;研究变化&#xff0c;平衡&#xff0c;对不确定性、复杂性处理、动态适应以及系统性决策 《易经》&#xff08;又称《周易》&#xff09;是中国古代的一部哲学经典&#xff0c;主要讨论的是宇宙和生活中的变化规律。它不仅仅是一部占卜书籍&#xff0c;更…

【YOLO系列】 YOLO V4之正则化DropBlock

资料下载 论文下载&#xff1a;DropBlock: A regularization method for convolutional networks 一、简介 DropBlock是一种正则化技术&#xff0c;用于防止深度神经网络的过拟合。它通过在训练过程中随机丢弃网络中的一部分特征图&#xff0c;来增加模型的泛化能力。 文章中分…

在微信公众号上怎么实现拼团功能

拼团魅力&#xff1a;微信公众号上的拼团功能如何助力营销 一、引言 在这个数字化时代&#xff0c;微信公众号成为了企业与消费者互动的重要平台。而拼团功能作为微信营销的一大利器&#xff0c;为企业带来了巨大的商业价值。那么&#xff0c;如何在微信公众号上实现拼团功能&…

gseaplot3修改一下clusterProfiler默认绘图函数

直接使用clusterProfiler::gseaplot2绘图会出现下边的结果&#xff0c;导致四周显示不全&#xff0c;线的粗细也没办法调整&#xff0c;因为返回的是一个aplot包中的gglist对象&#xff0c;没太多研究。 p1 <- clusterProfiler::gseaplot2(gsea_result, gsea_result$ID, pv…

JavaScript初见

书写位置 和css差不多 行内script标签内script所引的js文件 输入输出语句 输入 prompt();输出 console();// 控制台显示 alert();//弹出框 alert(字符串 变量 ’\n‘);变量 声明 var neme 原神; var tele 1;不用管类型&#xff0c;真不错啊 **js中变量的声明不需…

Logback框架基本认识

文章目录 一.什么是Logback1.1 初识Logbcak 二.Logbcak的结构三.日志的级别四.配置组件详解4.1 logger 日志记录器属性的介绍如何在配置文件里配置 4.2 appender 附加器 配合日志记录器的输出格式4.2.1 控制台附加器4.2.2 文件附加器4.3.3滚动文件附加器 4.3 Filter: 过滤器&am…

记录一次应用服务响应慢问题排查过程

3个自建系统使用了一个统一的外部系统接入服务&#xff0c;该服务主要是统一处理外部系统对接&#xff0c;处理掉数据鉴权等问题&#xff0c;提供内部鉴权接口给自己的服务使用。类似一个对接网关。 问题背景 研发反应&#xff0c;后端接口请求时快时慢&#xff0c;影响演示效…

21.正则表达式

正则表达式 文章目录 正则表达式1. 正则表达式分类2. 基本正则表达式3. 扩展正则表达式 1. 正则表达式分类 正则表达式&#xff1a;REGEXP&#xff0c;REGular EXPression。 正则表达式分为两类&#xff1a; Basic REGEXP&#xff08;基本正则表达式&#xff09;Extended REG…

【MATLAB】快速绘制曲线图的形状,粗细,颜色

目录 MATLAB 快速绘制曲线图的形状&#xff0c;粗细&#xff0c;颜色 1.通过改变R-G-B 的值改变线条的颜色&#xff1a;2.通过改变c∈[1,∞)的值改变线条的粗细&#xff1a;3.线条形状&#xff0c;粗细&#xff0c;颜色选择&#xff1a;4.Matlab中画图实现案例&#xff1a; MA…

js封装根据年月日获取星座效果demo(整理)

//根据年月日获取星座 function getZodiacSign(dateString) {// 用法:const dateStr 2024-01-11;// const zodiacSign getZodiacSign(dateStr);const date new Date(dateString);const month date.getMonth() 1;const day date.getDate();if ((month 1 && day &…

Python教程39:使用turtle画美国队长盾牌

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

HTML date类型数前后端互传,页面显示date类型

springMVCthymeleafHTML(date) 1.实体类定义字段为date类型 private Date bizdate;2.前端HTML中input的date类型 <div class"form-group"><label for"bizdate">请输入交易日期</label><input type"date" class"form…

Edge浏览器设置自动刷新

1. 使用浏览器扩展 你可以在 Edge 的扩展商店中搜索并安装这些扩展。以下是一些常见的扩展&#xff1a; Super Auto Refresh: 提供了强大的自动刷新功能&#xff0c;可以根据自定义的时间间隔进行刷新。 Auto Refresh: 允许你设置页面刷新的间隔。 2. 使用开发者工具&#xff1…