《LeetCode》—— 哈希

今天刷题讲解的主要讲的是关于——哈希这个知识点的题目讲解。


目录

(一)缺失的第一个正整数

(二)数组中只出现一次的两个数字

1、直接法

2、哈希

(三)直线上最多的点数


(一)缺失的第一个正整数

链接如下:缺失的第一个正整数

题目展示:

题意分析:

分析题目,我们知道以下几点:

1、如果数组中有负数,对于负数的处理我们是忽略的,即只判断正数情况下缺失的第一个正整数;

2、对于长度为n的数组,并且无重复出现的数字,那么如果遍历数组之后,此时会有两种情况:

  •  ①如果数组中的元素出现了1~n之间的,那么我们就可以知道缺失的就是 n+1 这个数字;
  • ②相反,如果数组中的元素在 1~n 之间有缺失的,那么缺失数字就处于1~n 中的数字。如果是这种情况。我们只需利用哈希表判断出每个元素是否出现过即可。

具体做法:

  • step 1:首先就是需要创建一个哈希表,用于记录数组中出现的数字。
  • step 2:从头开始遍历数组,记录数组中数字出现的次数;
  • step 3:紧接着查询哈希表中是否有这个数字,如果没有,说明它就是数组缺失的第一个正整数

代码展示:

class Solution {
public:int firstMissingPositive(vector<int>& nums) {unordered_map<int, int> tmp;for (auto& e : nums) {if (e > 0) tmp[e]++;}for (int i = 1; i <= nums.size() + 1; i++) {if (tmp[i] == 0) return i;}return 0;}
};

性能分析:

 

  • 时间复杂度:O(n)。第一次遍历数组,记录数字出现次数为O(n),第二次最坏从1遍历到n,为O(n),因此时间复杂度为 O(n)。
  • 空间复杂度:O(n)。哈希表记录n个不重复的元素,长度为n,因此空间复杂度为 O(n)。

(二)数组中只出现一次的两个数字

链接如下:数组中只出现一次的两个数字

 题目展示:

 题意分析:

首先,本题的题意还是比较简单的。对于本题我们既可以使用哈希,也可以不使用哈希,这两种方法都可以作出本道题。接下来,我两种方法都给大家介绍一下。

1、直接法

具体思想:

  1. 直接去做,其实思想也很简单。首先,我们可以先对数组进行排序处理,这是非常关键的一步;
  2. 其次,对于排好序的数组,我们可以知道,对于相同的数字一定是挨在一起的,因此,我们可以利用这一点去对其进行判断。

 具体做法:

  • step 1:首先就是对数组中的元素进行排序处理;
  • step 2:从头开始遍历数组,查找出连续挨着的两个数字是不同的即可;
  • step 3:如果连续两个挨着的数字是相同的,那么我们只需从当前位置往后跳两个位置继续查找即可

代码展示:

class Solution {
public:vector<int> FindNumsAppearOnce(vector<int>& array) {// write code heresort(array.begin(),array.end());vector<int>tmp;int size=array.size();for(int i=0; i<size;++i ){if(array[i] == array[i+1])i++;elsetmp.push_back(array[i]);}return tmp;}
};

2、哈希

具体思想:

  1. 既然有两个数字只出现了一次,我们就统计每个数字的出现次数,利用哈希表的快速根据key值访问其频率值即可实现题目要求。

 具体做法:

  • step 1:首先还是对数组中的元素进行排序处理;
  • step 2:从头开始遍历数组,用哈希表统计每个数字出现的频率;
  • step 3:然后再遍历一次数组,对比哈希表,找到出现频率为1的两个数字,返回即可实现

代码展示:

class Solution {
public:vector<int> FindNumsAppearOnce(vector<int>& array) {// write code heresort(array.begin(), array.end());unordered_map<int, int> tmp;vector<int> res;for(auto& e : array)++tmp[e];//再次遍历数组for(int i = 0; i < array.size(); i++){//找到频率为1的两个数if(tmp[array[i]] == 1)res.push_back(array[i]);}return res;}
};

性能分析:

  • 时间复杂度:O(n),其中n为数组长度,两次单独的遍历数组每个元素
  • 空间复杂度:O(n),哈希表的长度应该为(n−2)/2

(三)直线上最多的点数

链接如下:149. 直线上最多的点数

 题目展示:

 

 题意分析:

本题暴力的解决就是任意举两个点来枚举直线,但是它的时间复杂度达到了O(N^3),所以这里就不过多的介绍;

那么我们可以怎么优化呢?我们以下图为例带大家理解思路:

注意:

  • 在计算斜率时如果换成浮点则会有精度的问题,因此我们换成分数来进行操作 

 具体做法:

  • step 1在点的总数量小于等于 2 的情况下,我们只需用一条直线将所有点串联,此时我们直接返回点的总数量即可;
  • step 2:从头开始遍历数组,枚举中心点;
  • step 3:紧接着通过中心点去算出与其他点的斜率斜率,计算出最多的个数。在重复上述操作即可实现;

 代码展示:

class Solution {
public:int maxPoints(vector<vector<int>>& points) {int n = points.size();//当结点数小于2时,直接返回即可if (n < 2) return n;int ans = 0;//枚举中心店for (int i = 0; i < n; i++) {//定义哈希表来统计每个斜率的数量unordered_map<string, int> tmp;//定义Count用来来表示最大的数量int Count = 0;//枚举剩余点,因为i之前的已经枚举过了,所以才 i+1开始for (int j = i + 1; j < n; j++) {//获取两点的坐标int x1 = points[i][0] ,y1 = points[i][1];int x2 = points[j][0] ,y2 = points[j][1];//计算斜率string key = clac(x1,x2,y1,y2);tmp[key]++;//更新CountCount = max(Count, tmp[key]);}//一个中心点完成后更新结果ans = max(ans, Count+1);}return ans;}string clac(int x1, int x2, int y1, int y2){//计算横纵坐标的差值,注意记得加绝对值int index=abs(x1-x2);int indey=abs(y1-y2);//最大公约数int val=gcd(index, indey);//拼接string key=to_string (indey / val) + "_" + to_string (index / val);//斜率为负,拼接一个 -号if((x1 < x2 && y1 > y2) || (x1 > x2 && y1 < y2))return "-" + key;return key;}
};

性能分析:

  • 时间复杂度:O(n^2*logn),其中n为数组长度,枚举中心点需要O(N),而斜率分组也需要O(N),对于最大公约数需要O(logN),因此时间复杂度为O(n^2logn)
  • 空间复杂度:O(n),因为需要哈希表来记录,因此空间复杂度为O(N)。


到此,关于哈希表的三道题就讲解结束了。希望对大家有帮助,咱们下期再见!!!

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (53)-- 算法导论6.2 5题

五、MAX-HEAPIFY的代码效率较高&#xff0c;但第 10 行中的递归调用可能例外&#xff0c;它可能使某些编译器产生低效的代码。请用循环控制结构取代递归&#xff0c;重写 MAX-HEAPIFY代码。 文心一言&#xff1a; 以下是使用循环控制结构取代递归调用的 MAX-HEAPIFY 代码&…

【Day18】LeetCode算法刷题[1694. 重新格式化电话号码 ] [202.快乐数]

刷题打卡&#xff0c;第十八天 题目一、1694. 重新格式化电话号码题目二、202.快乐数 题目一、1694. 重新格式化电话号码 原题链接&#xff1a;1694. 重新格式化电话号码 题目描述&#xff1a; 给你一个字符串形式的电话号码 number 。number 由数字、空格 、和破折号 - 组…

List解答LeetCode杨辉三角

作者&#xff1a;月亮嚼成星~ 博客主页&#xff1a;月亮嚼成星~的博客主页 专栏&#xff1a;数据结构与算法 工欲善其事必先利其器&#xff0c;给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 了解杨辉三角 题目要求&#xff1a; 解答思…

张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士...

晓查 萧箫 明敏 鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 张朝阳当物理老师还真是当上瘾了。 刚刚直接完成了一场线下课&#xff0c;当场手推质能方程&#xff0c;一整面黑板墙都差点没盛下。 这个姿势&#xff0c;是不是有你大物老师内范儿了&#xff08;手动狗头&#xff09;…

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

七、设计算法&#xff0c;仅使用三次实数乘法即可完成复数 abi和cdi 相乘。算法需接收a、b、c和d 为输入&#xff0c;分别生成实部 ac-bd 和虚部adbc。 文心一言&#xff1a; 可以使用如下算法来计算复数 abi 和 cdi 的积&#xff0c;且只需进行三次实数乘法&#xff1a; 1.…

文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题

六、用Strassen 算法作为子进程来进行一个 knn 矩阵和一个nkn 矩阵相乘&#xff0c;最快需要花费多长时间?对两个输入矩阵规模互换的情况&#xff0c;回答相同的问题。 文心一言&#xff1a; Strassen 算法是一种用于矩阵乘法的分治算法&#xff0c;它将原始的矩阵分解为较小…

文心一言 VS 讯飞星火 VS chatgpt (41)-- 算法导论5.4 5题

五、在大小为n的集合中&#xff0c;一个k字符串构成一个k排列的概率是多少?这个问题和生日悖论有什么关系? 文心一言&#xff1a; 在大小为n的集合中&#xff0c;一个k字符串构成一个k排列的概率是1/k!&#xff0c;这是由于排列的总数是k!&#xff0c;而每个字符串被选中的…

文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题

五、使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始&#xff0c;由左至右处理&#xff0c;记录到目前为止已经处理过的最大子数组。若已知 A[1…j]门的最大子数组&#xff0c;基于如下性质将解扩展为 A[1…j1]的最大子数组:A[1…j1]的最大…

张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士

张朝阳当物理老师还真是当上瘾了。 刚刚直接完成了一场线下课&#xff0c;当场手推质能方程&#xff0c;一整面黑板墙都差点没盛下。 这个姿势&#xff0c;是不是有你大物老师内范儿了&#xff08;手动狗头&#xff09;。 ‍没地方继续推导了&#xff0c;擦黑板前还要感慨一句…

AI 绘画 - 建筑绘图辅助设计之 SD 基础

前情提要 如果你想学会一门东西&#xff0c;那么就给交给自己一个明确的任务&#xff0c;然后独立完成&#xff0c;之后我们就可以掌握这门技术了&#xff1b; 简介 SD建筑绘画主要目的是将建筑概念转化为可视化的表达形式&#xff0c;以便更好地传达设计理念给业主、团队成…

AI 绘画 - 建筑绘图辅助设计之模型训练

前情提要 2023-06-18 周日 杭州 小雨 小记: 昨天搞的好累&#xff0c;10点左右就想着先躺一会儿&#xff0c;然后就睡过去了&#xff0c;很奇怪&#xff0c;如果进行 AI 绘画&#xff0c;晚上就会做很奇怪的梦&#xff0c;说不上来的那种感觉&#xff0c;就是莫名的不舒服。 …

如何使用Midjourney辅助建筑设计,常用的提示和使用效果展示(内附Midjourney提示词网站)

文章目录 一.Midjourney建筑设计的提示技巧1. prompt模板12.prompt模板2 二、著名建筑师为例1.Zaha Hadid&#xff08;扎哈哈迪德&#xff09;2.Ludwig Mies van der Rohe&#xff08;路德维希密斯凡德罗&#xff09;3.Renzo Piano&#xff08;皮亚诺&#xff09;4.Stefano Boe…

解药 or 毒药:ChatGPT辅助设计,规划师和建筑师要失业了吗?

​人工智能聊天机器人ChatGPT火爆全球&#xff0c; 规划师笔记也紧赶潮流&#xff0c;快速尝试&#xff0c; AI与设计发生碰撞&#xff0c; 会产生怎样的火花&#xff1f; 运用AI帮助写文案、作图、视频剪辑、游戏制作等等随着2021被称为元宇宙元年&#xff0c;近些年来AI在…

谈人工智能AI的崛起:是威胁人类的革命性变革?--元理先生

随着OpenAI推出ChatGPT后&#xff0c;全球都在疯狂的推进人工智能的发展进程&#xff0c;而人工智能的迅速发展和应用&#xff0c;使我们面临着一个前所未有的挑战&#xff1a;人工智能是否将威胁到人类工作岗位的存在&#xff1f;元理先生将与大家探讨人工智能可能对人类工作造…

欧盟又出手!这次盯上了AI

今年称之为AI大年&#xff0c;一点都不为过。一个ChatGPT就引爆了全球的AI产业&#xff0c;它就像一颗久旱逢甘霖的草木&#xff0c;野蛮生长着。 木秀于林&#xff0c;AI风头正盛。作为全球最活跃的经济联盟之一&#xff0c;欧盟毫无疑问地也盯上了AI这个大明星。欧盟委员会执…

冯·诺依曼发表《第一份草案》 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 30 日。在电影史上&#xff0c;电影发展中一个重要步骤是彩色电影于 1930 年左右引入市场&#xff0c;而在 1948 年的今天&#xff0c;梅兰芳主演中国第一…

web前端Vue项目搭建流程

Node.js安装教程 一、安装环境 node.js下载官网: nodejs官网. 二、安装步骤 1、双击安装包&#xff0c;一直点击下一步。 2、点击change按钮&#xff0c;更换到自己的指定安装位置&#xff0c;点击下一步&#xff08;不修改默认位置也是可以的 &#xff09;。 3、一直点击下一步…

ChatGPT搭建AI网站实战

1.概述 ChatGPT是一款基于GPT-3.5架构的大型语言模型&#xff0c;它能够进行自然语言处理和生成对话等任务。作为一款智能化的聊天机器人&#xff0c;ChatGPT有着广泛的应用场景&#xff0c;如在线客服、智能助手、个性化推荐等。今天笔者给大家分享一下如何使用ChatGPT的API模…

20230623百度 Vs Google,百度差在哪里?【喊话李彦宏:为中华造芯IC】

20230623百度 Vs Google&#xff0c;百度差在哪里&#xff1f; 2023/6/23 18:45 百度搜索&#xff1a;google PDK 【百度可以为未来长期投资什么】 https://blog.csdn.net/cf2SudS8x8F0v/article/details/126187739 人人皆可免费造芯&#xff1f;谷歌开源芯片计划已释放90nm、…

2023年网络安全趋势

数据安全越来越重要。 我国《数据安全法》提出“建立健全数据安全治理体系”&#xff0c;各地区部门均在探索和简历数据分类分级、重要数据识别与重点保护制度。 数据安全治理不仅是一系列技术应用或产品&#xff0c;更是包括组织构建、规范制定、技术支撑等要素共同完成数据…