《LeetCode》—— 哈希

news2024/11/15 10:53:25

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


目录

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

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

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 here
        sort(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++;
            else
                tmp.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 here
        sort(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]++;
                //更新Count
                Count = 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.coloradmin.cn/o/506642.html

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

相关文章

力扣题库刷题笔记735-行星碰撞

1、题目如下&#xff1a; 2、个人Python代码实现 个人代码思路&#xff0c;主要是新建一个列表stack&#xff0c;将原列表asteroids中的元素依次加入到stack中。以上代码可能会有两部分比较冗余的部分&#xff0c;一是两个标志位可以不用单独声明&#xff0c;二是当stack列表中…

解析内存中的高性能图结构

在进行各种图处理、图计算、图查询的时候&#xff0c;内存或是硬盘中如何存储图结构是一个影响性能的关键因素。本文主要分析了几种常见的内存图结构&#xff0c;及其时间、空间复杂度&#xff0c;希望对你有所启发。 通常来说&#xff0c;对于图结构的几种常见的基础操作&…

通过SSH隧道安全消费Kafka数据

一.背景 由于我们有个业务在阿里云部署了Kafka&#xff0c;但是想直接在本地IDC机房服务器直接通过公网消费Kafka进行业务处理。这个本来也不是什么难事&#xff0c;阿里云把9092默认端口打开运行访问即可&#xff0c;也不不值得再写这篇博客了。 这个事情让人特别关注的一个主…

【记录】ChatGPT|图片预览魔法咒语魔改,使用 ChatGPT 返回大量可以跳转的链接

很早的时候&#xff0c;我已经留意到 ChatGPT 会以返回图片的 markdown 格式来显示图片&#xff0c;很可能拥有一定的图片上传功能&#xff0c;但是它往往会显示得有些问题。一些代码图片之类的或者风景图什么的都不是很会。 但其实 ChatGPT 是可以直接返回图片类型的回复的&a…

C++初始化列表

1.初始化列表概述 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 2.为什么使用初始化列表 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c…

个人电脑操作系统

UEFI&#xff08;Unified Extensible Firmware Interface&#xff0c;全称统一的可扩展固件接口&#xff09;是一种个人电脑系统规格&#xff0c;用来定义操作系统与系统固件之间的软件界面&#xff0c;作为BIOS的替代方案。其前身是Intel在1998年开始开发的Intel Boot Initiat…

【static_cast、reinterpret_cast、const_cast、dynamic_cast】C++类型转换

C类型转换 引入C语言中的类型转换 C的强制类型转换static_castreinterpret_catconst_castdynamic_cast向下转型的安全问题 explicit4种类型转换的应用场景 RTTI 引入 C语言中的类型转换 C语言和C都是强类型语言&#xff0c;如果赋值运算符左右两侧变量的类型不同&#xff0c;…

ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!

前言 ChatGPT由于在访问上有一些限制&#xff0c;使用并不便利。目前国内可以直接访问的大部分是调用API返回结果&#xff0c;我们去使用时总会有次数限制&#xff0c;而且它们可能随便崩掉。 其实&#xff0c;目前我们访问过的大部分国内的网页包括UI&#xff0c;其实是套用了…

过滤器对前端请求参数进行解码URLDecoder,接口接收参数类型为map,解码无效问题

文章目录 一、前言二、设计思路三、代码实现四、启动测试五、过滤器解码无效六、源码跟踪七、解决方案八、再次重启测试九、总结 一、前言 最近做的一个公司项目&#xff0c;因为客户需要对特殊字符做搜索&#xff0c;但是前端的请求参数无法传递到后端&#xff0c;所以前端对…

VS2017中Qt项目数据库连接——包含报错比如QMYSQL driver not loaded(细心看到最后,一定能解决你想解决的问题)

我把爆的错误QMYSQL driver not loaded写在文章末尾了&#xff0c;大家看一看&#xff01;前面是配置数据库 一、测试 VS2017 中 Qt 项目数据库连接 打开 VS2017&#xff0c;文件——新建项目&#xff0c;右侧输入框输入 Qt 确定后点击下一步&#xff0c;勾选模块 基类也是默…

RSU路测单元,你知道多少?

一、什么是RSU路测单元&#xff1f; RSU路测单元是实现智慧的路、车路协同的关键设备&#xff0c;设置在路侧&#xff0c;与附近过往车辆进行双向通信、交互数据&#xff0c;是智能交通系统中的一种重要设备。RSU可以连接路面原有电子设备&#xff0c;比如信号灯和摄像头&…

一文解决Xshell无法连接vmware上的centos

问题描述 win10系统上安装VMware workstation16 pro&#xff0c;装好后安装centos虚拟机&#xff0c;在设置network & hostname时选择的NAT模式&#xff0c;即使用自定义的网关和IPv4地址&#xff0c;最后配置完成后centos主机地址信息如下&#xff0c;在虚拟机内部进行pi…

【一览无余】Vue框架下Cesium加载遥感地图使用GeoServer切割TIF大文件对外发布WMS服务进行地图绘制(科普篇2/2)

【一览无余】Vue框架下Cesium加载遥感地图使用GeoServer切割TIF大文件对外发布WMS服务进行地图绘制&#xff08;科普篇2/2&#xff09; 二、Cesium是弄啥嘞2.1 WebGL2.1.1 WebGL是什么2.1.2 WebGL优点 2.2 Cesium是什么2.3 Cesium能干什么2.4 Cesium相关工具有哪些2.5 相关案例…

Echarts 3D散点图

文章目录 以下是一个 html echarts的案例 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts 3D Scatter Plot Demo</title><!-- 引入 ECharts --><script src"https://cdnjs.cloudflare.com/…

急吗?光急可没用呀!满满干货,两小时速成,别搁那干瞪眼了!

全球产业链加速重构&#xff0c;各种不确定性加大&#xff01;数字经济规模不断提升&#xff0c;为企业转型与发展创造大量机会&#xff01;企业亟须以数字化为工具或手段&#xff0c;再造组织流程和业务流程&#xff0c;以数字化确定性应对外部环境变化的不确定性&#xff0c;…

中检集团:把数智化转型作为“1号工程”

2018年4月&#xff0c;中国检验认证集团&#xff08;以下简称“中检集团”&#xff09;启动信息化建设“1号工程”&#xff0c;5年时间&#xff0c;从“数字中检1.0”升级到“2.0”再到“2.1”“2.2”&#xff0c;中检集团在数智化转型过程中&#xff0c;可谓是打了一场攻坚战。…

智能ai文章伪原创工具-智能ai文章原创处理系统

智能AI文章伪原创工具 您好&#xff0c;智能AI文章伪原创工具是一种通过机器学习和自然语言处理技术&#xff0c;帮助用户生成“看起来像是”原创文章的人工智能工具。该工具的原理是将原始文章分解为各个句子和段落&#xff0c;然后对其中的一些单词、短语或句子进行修改或替…

MySQL高级(进阶)SQL语句

#显示一个字段或者多个字段的所有内容 SELECT “字段” FROM 表名 &#xff1b; #distinct对字段去重查询 &#xff08;最好只对单个字段进行去重&#xff09; SELECT DISTINCT 字段名 FROM 表名 #where 有条件查询 SELECT “字段” FROM 表名 WHERE 条件&#xff08;例如&a…

安卓开发:使用可为null性

Kotlin园地 地址&#xff1a;Kotlin 园地 | Android 开发者 | Android Developershttps://developer.android.google.cn/training/kotlinplayground?hlzh-cn 以下简称 “K园” 先在K园执行以下代码&#xff1a; fun main() {var fa: String "sandra on";prin…

服务攻防-协议漏洞-FTPRDPSSHRsyncProFTPDlibsshOpenssh-Hydra工具使用口令猜解未授权访问

目录 一、导图 二、口令猜解-Hydra-FTP&RDP&SSH 1、协议介绍 2、Hydra工具介绍 3、实例演示 三、配置不当-未授权访问-Rsync 文件备份 1、Rsync介绍 2、漏洞成因——配置不当 3、实例演示 四、协议漏洞-应用软件-FTP&ProFTPD搭建 1、引入 2、ProFTPD介…