数据结构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.hqwc.cn/news/339219.html

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

相关文章

JVM基础(4)——JVM存活判定算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

自己在家怎么给电脑重装系统不用U盘?

自己在家怎么给电脑重装系统不用U盘&#xff1f;用户发现自己在家用的电脑系统出现很严重的问题&#xff0c;但又没有U盘&#xff0c;想知道有什么方法能够给电脑重新安装上一款正常的系统&#xff1f;接下来小编给用户们分享不用U盘完成系统重新安装的方法步骤&#xff0c;一键…

【HTML】对字体的所有操作详解(经典)

目录 一、文字样式设置的基本标签二 、 设置文字的颜色三、设置文字的尺寸四、 设置文字的字体五、 使文字倾斜六、 使文字加粗七、处理网页中的特殊字符十、 如何更方便地忽略浏览器对部分HTML的解析十一、 其他文字修饰方法十二、为了让文字富有变化&#xff0c;或者为了着意…

异步编程利器:CompletableFuture深度解析

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 摘要如何使用源码解析基本结构内部原理执行流程 方法介绍创建对象异步执行任务链式操作异步任务组合异常处理取值与状态超时控制与取消操作依赖完成并发限制记忆…

66、python - 代码仓库介绍

上一节,我们可以用自己手写的算法以及手动搭建的神经网络完成预测了,不知各位同学有没有自己尝试来预测一只猫或者一只狗,看看准确度如何? 本节应一位同学的建议,来介绍下 python 代码仓库的目录结构,以及每一部分是做什么? 我们这个小课的代码实战仓库链接为:cv_lea…

Python 面向对象之单例模式

【一】单例模式概念 单例模式是一种设计模式&#xff0c;其核心思想是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式通常用于管理共享的资源&#xff0c;例如配置信息、数据库连接、线程池等。关键点在于如何判断这个类是否已经实例化 通过模块导入&…

Codeforces Round 911 C. Anji‘s Binary Tree

原题&#xff1a; C. Anji’s Binary Tree time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output Keksic keeps getting left on seen by Anji. Through a mutual friend, he’s figured out that Anji really …

人工智能行业的发展前景如何?

人工智能&#xff08;AI&#xff09;已经成为如今科技领域的热门话题之一&#xff0c;从图像识别到自动驾驶&#xff0c;从语音助手到智能机器人&#xff0c;AI技术正在改变我们的生活方式。随着技术的不断发展和应用的扩大&#xff0c;人工智能行业的发展前景无疑是非常广阔的…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability(LTI)线性时不变

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability-LTI线性时不变

数字之美:探秘数据可视化如何在我们的日常生活中展现魅力

数据可视化是如何通过多种方式走进我们生活的呢&#xff1f;它不仅仅是冰冷的数字和图表&#xff0c;更是一门让信息跃然纸上的艺术。让我们一同探讨数据可视化如何以多种方式渗透进我们的日常生活&#xff0c;为我们呈现丰富而生动的信息画卷。下面我就以可视化从业者的角度来…

网络正常运行时间监控工具

正常运行时间是衡量系统可靠性的指标&#xff0c;表示为机器工作和可用时间的百分比。当提到 IT 网络时&#xff0c;正常运行时间是衡量网络设备、网站和其他服务的可用性的指标。网络正常运行时间通常以百分位数来衡量&#xff0c;例如“五个 9”&#xff0c;这意味着系统在 9…