当前位置: 首页 > news >正文

【面试经典150题】H 指数

题目链接

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数

根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。如果 h 有多种可能的值,h 指数 是其中最大的那个。

  • n == citations.length
  • 1 <= n <= 5000
  • 0 <= citations[i] <= 1000

关键就是这句“至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次”,简单点说就是找出 h 个元素,里面每个值都大于等于 h。

方法1:

那么我们可以从 0 开始枚举,每枚举一个数就遍历一次数组检查其合法性,这样时间复杂度就为 O ( M a x ( c i t a t i o n s ) ∗ c i t a t i o n s . l e n g t h ) O(Max(citations) * citations.length) O(Max(citations)citations.length),最多执行 5*10^6 次。

/*** @param {number[]} citations* @return {number}*/var hIndex = function (citations) {let k = 0;let candidate=0;while (k <= citations.length) {let count = 0;for (let i = 0; i < citations.length; i++) {citations[i] >= k && count++;if (count >= k && k !== 0) {candidate = k;break;}}k++;}return candidate;
};

在 leetcode 上的运行时间击败率太低。

我们另寻他路。

方法2:

将数组进行从大到小的排序,往后遍历,自增量 i 加上 1 就是当前发表论文的最大数量,而当前值 citations[i] 就是其中的最小值,只要满足 citations[i]>=i+1就是我们要寻找的最大的 H 指数。

/*** @param {number[]} citations* @return {number}*/var hIndex = function (citations) {citations.sort((a, b) => b - a);let h = 0;for (let i = 0; i < citations.length; i++){if (citations[i] >= i + 1) {h = i+1;} else {return h;}}return h;
};

sort 排序的算法是该方法的时间复杂度的主要开销,其底层实现做了很多优化。

V8引擎中数组的sort源码

源码注释说:This file implements a stable, adapative merge sort variant called TimSort.

意思是说它是一个稳定的自适应归并排序,称为 TimSort。

http://www.lryc.cn/news/158034.html

相关文章:

  • ARM DIY(十)LRADC 按键
  • 每日一练 | 网络工程师软考真题Day31
  • 最优化:建模、算法与理论(优化建模——2)
  • 库的相关操作
  • 程序分区:全局区、常量区、栈区、堆区、代码区
  • Jtti:windows虚拟机如何设定永久静态路由
  • RocketMQ(3)之事务消息
  • 基于多设计模式下的同步异步日志系统
  • API接口与电商平台之间的联系,采集京东平台数据按关键字搜索商品接口示例
  • 代码随想录day41|343. 整数拆分96. 不同的二叉搜索树
  • Less常用内置函数
  • pdf转换成图片转换器在线怎么转?pdf转换成图片具体方法介绍
  • JavaScript动态设置浏览器可视区域元素的文字颜色、监听滚动条、querySelectorAll、getBoundingClientRect
  • 意向客户的信息获取到底是怎样的,快来get一下
  • 自动化测试常用脚本语言有哪些?
  • mapreduce 的工作原理以及 hdfs 上传文件的流程
  • Ubuntu22.04安装ROS2
  • uniapp - 倒计时组件-优化循环时间倒计时
  • java 实现访问者模式
  • JDK源码剖析之PriorityQueue优先级队列
  • TSINGSEE青犀AI视频分析/边缘计算/AI算法·人脸识别功能——多场景高效运用
  • 力扣(LeetCode)算法_C++——最大连续 1 的个数 III
  • 23062C++QT day2
  • React三属性之:props
  • 大数据安全 | (一)介绍
  • 软件工程的概念及其重要性
  • [足式机器人]Part3 变分法Ch01-2 数学预备知识——【读书笔记】
  • 【嵌入式开发 Linux 常用命令系列 7.1 -- awk 过滤列中含有特定字符的行】
  • 前端(十六)——Web应用的安全性研究
  • 无涯教程-JavaScript - BIN2HEX函数