【面试经典150 | 数组】H 指数

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:排序
    • 方法二:二分
    • 方法三:计数排序
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【排序】【数组】


题目来源

面试经典150 | 274. H 指数


题目解读

有一个数组 citiations,其中 citiations[i] 表示某一个研究员的论文 i 被引用的次数,你要做的是找出该名研究员的 h 指数

h 指数,代表 “高引用次数”,表示有 h 篇论文且每一篇论文被引用了至少 h 次。


解题思路

方法一:排序

我们首先对数组 citiation 进行排序(一般不提及排序方式即升序还是降序排序,默认都是升序排序),然后对排序后的 citiation 从大到小进行遍历。

初始化 h = 0h 表示的是被引用了 h 次的论文数量,我们在遍历的过程中,如果 citiation[i] > h 表明我们找到了 h+1 篇至少被引用了 h+1 次的论文,这时候更新 h++h。我们就这样遍历数组,直到 h 不再增加,最后返回 h 即为最终的答案。

实现代码

class Solution {
public:int hIndex(vector<int>& citations) {sort(citations.begin(), citations.end());int h = 0, i = citations.size() - 1;while (i >= 0 && citations[i] > h) {++h;--i;}return h;}
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 为数组 citiation 的长度,这是排序的时间复杂度。

空间复杂度: O ( l o g n ) O(logn) O(logn),这是排序占用的额外空间。

方法二:二分

我们可以二分枚举答案,即 h 的数量,h 最少有 0 个,最多有 citiations.size() 个。

对于当前二分枚举的答案 mid

  • 如果数组 citiations 中的论文被引用次数大于等于 mid 的论文数大于等于 mid,我们右移二分枚举的下限,因为 h 指数可能更大;
  • 否则,我们左移二分枚举的上限。

计算数组中论文被引用次数大于等于 mid 的论文数直接枚举计数就可以。

实现代码

class Solution {
public:int hIndex(vector<int>& citations) {int l = 0, r = citations.size();while (l < r) {int mid = (l + r + 1) >> 1;int cnt = 0;for (int x : citations) {if (x >= mid) ++cnt;}if (cnt >= mid) l = mid;else r = mid - 1;}return l;}
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),二分枚举的时间复杂度为 O ( l o g n ) O(logn) O(logn),每次枚举中需要 O ( n ) O(n) O(n) 的时间复杂度计算数组中论文被引用次数大于等于 mid 的论文数,因此总的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

空间复杂度: O ( 1 ) O(1) O(1),使用的额外空间仅仅是几个二分枚举时的辅助变量。

方法三:计数排序

其实还有一种排序的方法,计算排序是对方法一排序时间复杂度的优化。

具体地,我们使用一个数组 cnts 来记录被引用次数从 0n 的对应的论文数量,其中 cnts[n] 表示引用次数大于 n 的论文数量。

首先,遍历数组 citiation 来更新 cnts。最后,我们从后往前遍历数组 cnts,我找到大于等于当前引用次数 i 的论文数量,一旦找到一个 i 直接返回,因为我要找的是最大的 h

实现代码

class Solution {
public:int hIndex(vector<int>& citations) {int n = citations.size();vector<int> cnts(n + 1); // 当前引用次数的文章有几篇for (int i = 0; i < n; i++) {if (citations[i] >= n) {cnts[n]++;} else {cnts[citations[i]]++;}}int cnt = 0;for (int i = n; i >= 0; i--) {cnt += cnts[i];if (cnt >= i) {return i;}}return 0;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n),计数排序的时间复杂度。

空间复杂度: O ( n ) O(n) O(n),使用的额外变量为统计被引用论文数的数组 cnts

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

社区活跃开发者 Aaron 加入 sCrypt

Aaron&#xff08;周全&#xff09;是资深的 BSV 开发者&#xff0c;前 nChain BSV 基础架构团队成员&#xff0c;也是比特币协会在中国任命的首位技术推广专家。作为 BSV 社区的活跃成员&#xff0c;他多次作为演讲者参与区块链技术会议&#xff0c;开发了 Webot 应用、Witnes…

Flink容错机制

容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我们不停地做存档操作。如果每处理一条数据就进行检查点的保存…

Turf处理等压线

Turf是一个用于空间分析的JavaScript库。它包括传统的空间操作、用于创建GeoJSON数据的辅助函数以及数据分类和统计工具。Turf可以作为客户端插件添加到您的网站&#xff0c;也可以使用Node.js在服务器端运行Turf。 Turf是一个模块化的js类库&#xff0c;所有的模块都是在packa…

优维产品最佳实践:实例视图

背 景 模型可以定义很多的字段&#xff0c;当这些字段越来越多的时候&#xff0c;直接打开实例页面&#xff0c;会杂乱无章的呈现出来&#xff0c;对于用户来说无法快速的找到想要的信息&#xff0c;也不便于查看数据。而且并不是所有的字段都一定会录入了数据&#xff0c;常常…

路由器和路由到底啥区别?

在Vue中会有路由&#xff08;Route&#xff09;的概念&#xff0c;一些伙伴还不知道嘞&#xff0c;这就给大家讲解一下 我们日常出行都会碰到导航这个概念。 导航系统会给出从当前位置到目标位置的建议路径,这就是路由。 而 GPS 导航仪根据路由提供的路径,告诉我们每个路口是…

文档在线预览word、pdf、excel文件转html以实现文档在线预览

目录 一、前言 1、aspose2 、poi pdfbox3 spire二、将文件转换成html字符串 1、将word文件转成html字符串 1.1 使用aspose1.2 使用poi1.3 使用spire2、将pdf文件转成html字符串 2.1 使用aspose2.2 使用 poi pbfbox2.3 使用spire3、将excel文件转成html字符串 3.1 使用aspose…

Linux常见指令(1)

Linux常见指令[1] 一.前言1.操作系统简述 二.Linux常见指令1.登录Xshell2.Linux下的常见命令1.pwd2.ls1.ls -a2.ls -d3.ls -l 3.cd Linux中的文件系统1.文件的相关知识2.Linux下目录结构的认识1.什么叫做路径?2.Linux的整体目录结构3.为什么要有路径呢?4.绝对路径与相对路径 …

IntelliJ IDEA - Maven 在控制台Maven编译正常,但是在IDEA中不正常,表现不一致

文章目录 现象原因解决验证 现象 一个Maven项目&#xff0c;当导入到IDEA后&#xff0c;无法在IDEA中正常的编译和下载jar依赖&#xff0c;类似下面的截图。 但是在Windows控制台却可以正常编译&#xff0c;类似下面的截图。 CMD执行&#xff1a;mvn clean install -Dmaven.te…

就只说 3 个 Java 面试题

在面试时&#xff0c;即使是经验丰富的开发人员&#xff0c;也可能会发现这是一些很棘手的问题&#xff1a; 1、Java中“transient”关键字的用途是什么&#xff1f;如何才能实现这一目标&#xff1f; 在 Java 中&#xff0c;“transient”关键字用于指示类的特定字段不应包含…

(一)设计模式概述

设计模式是由GoF (Gang of Four&#xff09;首先提出的&#xff0c;它是解决特定问题的解决方案。设计模式本身是一种发现&#xff0c;而不是一种发明。学习设计模式可以让我们从别人的成功经验中获取新的灵感&#xff0c;从而写出更优秀的代码。 设计模式的主要特点如下&…

idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

Unity 制作登录功能01-创建登录的UI并获取输入内容

1.创建UI面板 导入插件TextMesh Pro 2.编写脚本获取用户输入 这里用的是输入框侦听函数&#xff0c;所有UI都可以使用侦听函数 &#xff0c;需要注意TMP_InputField 这个类是UI中导入的一个插件TextMesh Pro&#xff01;在代码中需要引用using TMPro; 命名空间&#xff01; …

使用自功率谱、互功率谱估计滤波器幅频特性

这段时间终于对工程中的随机信号的一般处理方式有点头绪了&#xff0c;功率谱密度估计是十分重要的方式之一&#xff0c;仍需继续深入细化相关内容。 示例&#xff1a;使用自功率谱、互功率谱估计滤波器幅频特性&#xff0c;自己实现 & Matlab自带函数实现。 clc;clear;cl…

rv1126-rv1109-烧录方法之TFTP

注意&#xff1a;开机按ctrlC既可以进入uboot指令集 因为之前习惯了用RK的烧录工具&#xff0c;为了兼容ssd202d的烧录方法 于是我开始尝试了使用ssd202d的方法烧录 SSD202D的方法是 烧录uboot 然后用TFTP烧录下去&#xff0c;于是我开始尝试 烧录前三个即可&#x…

写给程序员的跳槽攻略

未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 有读者提问&#xff1a;我在现在这家公司呆了 4 年了&#xff0c;工作上说实话压力不大&#xff0c;每天按部就班做着重复性的工作&#xff0c;基本上没有什么大的挑战&#xff0c;最近有…

分布式锁——什么是看门狗?什么是redlock算法?带你全面了解~

目录 1、什么是分布式锁 2、引入setnx 3、引入过期时间 4、引入检验id 5、引入lua脚本 6、引入看门狗 7、redlock算法 1、什么是分布式锁 我们在前面学习中&#xff0c;都有了解关于线程安全的问题&#xff0c;那引发这个问题的关键就是&#xff0c;多个线程去修改了同一…

MIPI协议介绍-CPHY

MIPI协议概述 MIPI(Mobile Industry Processor Interface): 是MIPI联盟发起为移动应用处理器制定的开放标准.MIPI接口协议层主要包括CSI和DSI两种,其中CSI主要用于图像输出&#xff0c;如图像传感器等&#xff1b; DSI主要用于图像输入&#xff0c;如屏幕显示器等.对于camera而…

vs2019配置libcurl环境

一、libcurl下载地址&#xff1a;curl - Download 二、解压下载的压缩包&#xff0c;进入projects\Windows\VC14目录 三、用vs2019打开curl-all.sln工程&#xff0c;选择LIB Debug&#xff0c;x64进行编译 编译后的文件为&#xff1a;curl-8.2.1\build\Win64\VC14\LIB Debug\li…

【Git】轻松学会 Git(一):掌握 Git 的基本操作

文章目录 前言一、创建 Git 本地仓库1.1 什么是仓库1.2 创建本地仓库1.3 .git 目录结构 二、配置 Git三、认识 Git 的工作区、暂存区和版本库3.1 什么是 Git 的工作区、暂存区和版本库3.2 工作区、暂存区和版本库之间的关系 四、添加文件4.1 添加文件到暂存区和版本库中的命令4…

【python入门篇】列表简介及操作(2)

列表是什么&#xff1f; 列表是由一系列按特定顺序排列的元素组成。你可以创建包含字母表中的所有字母、数字 0~9 或所有家庭成员的列表&#xff1b;也可以将任何东西加入列表中&#xff0c;其中的元素之间可以没有任何关系。列表通常包含多个元素&#xff0c;因此给列表指定一…