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

每日一题:H指数

继续给大家带来每日一题

题目描述

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

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

题目示例

在这里插入图片描述

这道题目读起来可能有些拗口,我给大家翻译翻译,题目的核心就是找一个最大值h,使其能够满足

  • h<=数组大小
  • 数组里大于等于h的元素个数m,要求m>=h

如下图所示:
在这里插入图片描述

无论什么思路,其核心就是找上面的两个关系:

1.h<=数组大小,所以我们最简单粗暴的思路就是从h=1开始统计,直到h=n(数组大小,也就是题目中的论文个数)

2.数组里大于等于h的元素个数m,要求m>=h 这种才是有效的h

以题目中的case为例:

citations=3, 0, 6, 1, 5

  • h=1,满足大于等于1的数字有:3,6,1,5
  • h=2,满足大于等于2的数字有:3,6,5
  • h=3,满足大于等于3的数字有:3,6,5
  • h=4,满足大于等于4的数字有:6,5
  • h=5,满足大于等于5的数字有:6,5
  • h=6,满足大于等于6的数字有6

下面我们接着去找符合满足的数量要大于h

  • h=1,满足的论文数:4 4>=1符合
  • h=2,满足的论文数:3 3>=2符合
  • h=3,满足的论文数 3 3>=3符合
  • h=4,满足的论文数 2 2>=4 不符合
  • h=5,满足的论文数 2 2>=5 不符合
  • h=6,满足的论文数 1 1>=6 不符合

所以取符合的最大h h=3
然后我们接着来看代码实现:
最暴力的解法是:直接按照我们上面的思路来

    public static int hIndex(int[] citations) {int n = citations.length;Map<Integer, Integer> indexMap = new HashMap<>();for (int i = 1; i <= n; i++) {for (int j : citations) {int count = indexMap.getOrDefault(i, 0);if (j >= i) {indexMap.put(i, ++count);}}}int max = 0;for (Map.Entry<Integer, Integer> entry : indexMap.entrySet()) {int h = entry.getKey();int count = entry.getValue();if (count >= h) {max = Math.max(h, max);}}return max;}

在这里插入图片描述

我们尝试着优化一下:如:

citations=3, 0, 6, 1, 5

我们先进行排序,排序后:0 1 3 6 5
h=1 我们发现1符合的时候,后面的就不用计算累加了,因为1后面的数组均符合,所以h=1 对应的论文数:n-index(1)=5-1=4

同理h=2 h=3…均可以以这种方式计算

    public static int hIndex2(int[] citations) {int n = citations.length;Arrays.sort(citations);Map<Integer, Integer> indexMap = new HashMap<>();for (int i = 1; i <= n; i++) {for (int j = 0; j < n; j++) {if (citations[j] >= i) {indexMap.put(i, n - j);break;}}}int max = 0;for (Map.Entry<Integer, Integer> entry : indexMap.entrySet()) {int h = entry.getKey();int count = entry.getValue();if (count >= h) {max = Math.max(h, max);}}return max;}

运行时间:
在这里插入图片描述

但是上面两种方式每次都需要从头开始找,浪费了我们排序的性能带来的便利,所以我们可以用一个索引指向计算下一个h时需要从数组的哪个位置开始读取

citations=3, 0, 6, 1, 5
排序后:0 1 3 6 5

h=1,遍历到index=1的位置
h=2,直接从index=1开始遍历,index=2时找到大于等于2的论文
h=3,直接从index=2开始遍历
依此类推
在这里插入图片描述

上面的三种方式均需要我们去二次遍历map,其实我们在第一次找每个h对应的论文数量时就可以去定位到符合条件的最大h,减少了一次遍历

    public static int hIndex4(int[] citations) {int n = citations.length;Arrays.sort(citations);int j = 0;int max = 0;for (int i = 1; i <= n; i++) {while (j < n) {if (citations[j] >= i&& (n - j) >= i) {max = Math.max(max, i);break;}j++;}}return max;}

四次改进的耗时对比:
在这里插入图片描述

这道题目并不难,只是想通过这道题目告诉大家不要上来就去尝试最优解,可以逐步推进来提升自己的逻辑思维和算法思维

http://www.xdnf.cn/news/10059.html

相关文章:

  • Vue 3前沿生态整合:WebAssembly与TypeScript深度实践
  • systemctl实现定时任务(比crontab好用)
  • Python中的变量、赋值及函数的参数传递概要
  • ch12 课堂参考代码 及 题目参考思路
  • E. Melody 【CF1026 (Div. 2)】 (求欧拉路径之Hierholzer算法)
  • shadcn/ui
  • 探索智能仓颉:Cangjie Magic开发体验全记录
  • 昂瑞微在蓝牙亚洲大会上隆重推出新一代超低功耗蓝牙SoC芯片OM6627
  • 基于微服务架构的社交学习平台WEB系统的设计与实现
  • 换行符在markdown格式时异常
  • 无人机视角海上漂浮物检测与人员救援检测数据集VOC+YOLO格式2903张6类别
  • Linux安装及管理程序
  • 经营分析会,财务该怎么做?
  • 智能制造全场景数字化解决方案
  • 虚拟旅游:打破时空界限的新体验
  • Centos7搭建zabbix6.0
  • Python训练营---Day40
  • 操作系统学习(五)——线程通信
  • 调用Gensim库训练Word2Vec模型
  • 缓存穿透、缓存击穿、缓存雪崩目前记录(纯日记)
  • cocosCreator 1.8 升级到 2.4
  • 制作一款打飞机游戏63:自动保存
  • SpringAI系列 - 升级1.0.0
  • 大模型-modelscope下载和使用chatglm3-6b模型
  • 运维 pgsql 安装完后某次启动不了
  • 骨架工程—组织主数据管理
  • MySQL常见故障排查与性能优化
  • ReactJS 中的 JSX工作原理
  • Haption在危险、挑战性或受限环境中操作的情况提供了一种创新的遥操作解决方案
  • 在 Linux 上安装 `pgvector`(这是一个 PostgreSQL 的向量类型扩展,常用于处理嵌入向量,便于进行向量相似度搜索)