每日一题:H指数

article/2025/7/14 19:20:30

继续给大家带来每日一题

题目描述

给你一个整数数组 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.hkcw.cn/article/vGqFrlNBVf.shtml

相关文章

MPU9250_WE库详解

MPU9250_WE库 https://docs.arduino.cc/libraries/mpu9250_we/ https://github.com/wollewald/MPU9250_WE 三款MPU6050、MPU6500、MPU9250陀螺仪 其初始化以及函数应用方法基本一致,创建初始化对象名称有所差异 初始化相关函数 用于初始化传感器。该函数会尝试与传感器建…

onlyoffice docspace 协作空间企业版使用秘籍-1.如何连接外部存储

背景介绍 ONLYOFFICE 协作空间是一个可在自定义房间中协作处理文本文档、电子表格、演示文稿、表格和 PDF 文件的平台。用户可设置灵活的访问权限&#xff0c;与同事、客户及合作伙伴共享房间和文档。最棒的一个功能是支持文档的中文全文检索功能,方便根据内容找到需要的文档。…

openppp2 -- 1.0.0.25225 优化多线接入运营商路由调配

本文涉及到的内容&#xff0c;涉及到上个发行版本相关内容&#xff0c;人们在阅读本文之前&#xff0c;建议应当详细阅读上个版本之中的VBGP技术相关的介绍。 openppp2 -- 1.0.0.25196 版本新增的VBGP技术-CSDN博客 我们知道在现代大型的 Internet 网络服务商&#xff0c;很多…

Predixy的docker化

概述 当前已有一套redis cluster的集群&#xff0c;但是fs中的hiredis只能配置单实例redis。 AI了一下方案&#xff0c;可以使用redis的proxy组件来实现从hiredis到redis cluster的互通。 代码地址&#xff1a;https://github.com/joyieldInc/predixy Predixy特性介绍&…

Fusion引擎赋能:流利说如何用阿里云Serverless Spark实现数仓计算加速

作者&#xff1a;流利说 Ibson&#xff08;大数据负责人&#xff09;/ Bruce&#xff08;数据工程师&#xff09; 背景介绍 行业 流利说是领先的科技驱动的教育公司&#xff0c;公司自主研发了领先的英语口语评测、写作打分引擎和深度自适应学习系统&#xff0c;致力于为用户…

Leetcode 340. 至多包含 K 个不同字符的最长子串

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个整数 k &#xff0c;请你找出 至多 包含 k 个 不同 字符的最长子串&#xff0c;并返回该子串的长度。 1.2.题目地址 https://leetcode.cn/problems/longest-substring-with-at-most-k-distinct-characters/description…

历年中南大学计算机保研上机真题

2025中南大学计算机保研上机真题 2024中南大学计算机保研上机真题 2023中南大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 进制转换 题目描述 请写出一段程序&#xff0c;将十进制数字转为八进制。 输入格式 第一行输入 T T T ( 1 ≤ T ≤…

【js逆向】某某省过验证码逆向

查看响应 查看验证码包 send里面就是载荷的密文 向上跟栈 进入到i里面 找到params的加密处 断点&#xff0c;刷新 提示少扣取 报错&#xff1a;st is not defined 全部扣完后发现不报错但是没输出&#xff1a; 一个难以发觉的错误&#xff0c;大量扣取&#xff0c;不容易被发现…

土耳其总统:支持俄乌代表团的谈判继续推进

当地时间5月30日,土耳其总统埃尔多安与乌克兰总统泽连斯基通电话。双方讨论了两国双边关系以及地区与全球局势。△土耳其总统埃尔多安(资料图)埃尔多安在对话中表示,土耳其将继续努力推动乌克兰与俄罗斯之间实现公正与持久的和平。土耳其支持两国代表团在伊斯坦布尔开启的谈…

下一代液晶显示底层技术与九天画芯的技术突围

一、液晶产业&#xff1a;撑起数字经济的显示脊梁 &#xff08;一&#xff09;全球显示市场的核心支柱 作为电子信息产业的战略基石&#xff0c;液晶显示&#xff08;LCD&#xff09;占据全球平板显示市场超 60% 的份额&#xff0c;2022 年全球市场规模达 782.41 亿元&#xf…

工控机安装lubuntu系统

工控机安装lubuntu系统指南手册 1. 准备 1个8G左右的U盘 下载Rufus&#xff1a; Index of /downloads 下载lubuntu系统镜像&#xff1a; NJU Mirror Downloads – Lubuntu 下载Ventoy工具&#xff1a; Releases ventoy/Ventoy GitHub 下载后&#xff0c;解压&#…

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤 一、前言 在使用 Linux 操作系统进行内核开发或者系统维护时&#xff0c;内核 panic 是最常见的系统崩溃环节。如果想要在内核崩溃后立即分析环境和输出内核内存 dump&#xff0c;Kdump crashkernel 是最接近完美的解…

day 25 异常处理

异常处理机制 Python 的异常处理机制赋予程序强大的容错能力。当程序在运行时遇到意外情况&#xff08;即异常&#xff09;&#xff0c;它不会直接崩溃&#xff0c;而是可以被设计成优雅地处理错误&#xff0c;或继续执行后续逻辑&#xff0c;或按可控方式结束。 在异常发生时…

智能流体仿真软件AICFD 2025R1新版本功能介绍

智能流体仿真软件AICFD是天洑软件自主研发的一款通用型智能热流体仿真工具&#xff0c;其核心代码拥有完全自主知识产权。该软件在业界率先引入人工智能技术&#xff0c;高效解决工业级流动、传热、多相流、噪声及燃烧等复杂仿真问题。 图1 AICFD软件界面 一、版本更新介绍 A…

数据结构之队列:原理与应用

一、基本原理 队列是一种特殊的线性表队列是一个有序表(可以用数组或链表实现)遵循“先来先服务”的原则&#xff0c;它只允许在表的前端&#xff08;队头&#xff09;进行删除操作&#xff0c;在表的后端&#xff08;队尾&#xff09;进行插入操作 (一) 核心操作 入队&…

windows下安装docker、dify、ollama

一、docker安装 镜像源配置 {"builder": {"gc": {"defaultKeepStorage": "10GB","enabled": true}},"experimental": true,"registry-mirrors": ["https://docker.m.daocloud.io","ht…

mysql隐式转换会造成索引失效的原因

现在我们看一个例子 比如现在我有一张表叫做test 涉及的字段有id code name age address id 是int数值类型 code 是varchar字符串类型 name 是varchar字符串类型 age是int 数值类型 address是varchar 字符串类型 创建语句&#xff1a; CREATE TABLE test ( id INT …

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程

Rainbond V6 国产化部署教程&#xff0c;针对鲲鹏 CPU 麒麟 V10 的离线环境&#xff0c;手把手教你从环境准备到应用上线&#xff0c;所有依赖包提前打包好&#xff0c;步骤写成傻瓜式操作指南。别说技术团队了&#xff0c;照着文档一步步来&#xff0c;让你领导来都能独立完成…

Python训练营---Day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…