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

代码训练LeetCode(22)研究者H指数

代码训练(22)LeetCode之研究者H指数

Author: Once Day Date: 2025年6月4日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 274. H 指数 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(22)LeetCode之研究者H指数
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

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

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

提示:

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

示例 1:

输入:citations = [3,0,6,1,5]
输出:3 
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。

示例 2:

输入:citations = [1,3,1]
输出:1
2. 分析

本题要求计算研究者的 h 指数,其中 h 指数的定义是:一位科研人员至少有 h 篇论文,每篇论文的引用次数至少也是 h 次。我们需要从给定的引用次数数组中确定这个最大的 h 值。

为了确定 h 指数,我们可以采用以下思路:

  1. 排序: 首先将引用次数数组进行排序,这样较高的引用次数会聚集在数组的后端。
  2. 遍历计算: 从数组的末尾开始向前遍历,检查当前位置的引用次数是否大于或等于当前的索引(经过适当调整),这个索引代表了“至少有多少篇论文”的数量。

分析步骤

  1. 排序数组: 对引用次数数组进行非降序排序。
  2. 遍历寻找 h 指数: 从后向前遍历排序后的数组,对每个位置 i,检查 citations[i] 是否大于或等于 len(citations) - i。如果是,更新 h 指数的最大值。

性能优化关键点

  • 排序算法: 使用 qsort 函数,其平均时间复杂度为 O(n log n)。
  • 一次遍历: 在排序后,只需单次遍历即可找到 h 指数,时间复杂度为 O(n)。
3. 代码实现
#include <stdio.h>
#include <stdlib.h>int compare(const void *a, const void *b) {return *(int*)a - *(int*)b;
}int hIndex(int* citations, int citationsSize) {qsort(citations, citationsSize, sizeof(int), compare);int h = 0;for (int i = 0; i < citationsSize; i++) {int currentH = citationsSize - i; // 计算当前的h值候选if (citations[i] >= currentH) {h = currentH; // 更新h值break;}}return h;
}int main() {int citations[] = {3, 0, 6, 1, 5};int citationsSize = sizeof(citations) / sizeof(citations[0]);int result = hIndex(citations, citationsSize);printf("The h-index is %d\n", result);return 0;
}
4. 总结

通过这道题目,我们可以学习到如何处理和分析实际问题(如学术论文的引用情况),并将其抽象为计算问题。这种能力对于算法设计和数据分析都是至关重要的。要提升这方面的能力,可以多做类似将实际问题抽象和转换为编程问题的练习,并学习更多的数据结构和算法知识来优化问题的解决方案。

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

相关文章:

  • 神经网络-Day44
  • 最新MySQL数据库主要版本系列差异比较及新增功能详解
  • DeepSeek 赋能智能零售,解锁动态定价新范式
  • SpringAI集成DeepSeek实战
  • 豆包突然没法用了,一打开就提示网络连接错误
  • Android 颜色百分比对照
  • OA工程自动化办公系统 – 免费Java源码
  • android 之 KeyguardService
  • Kafka入门-集群基础环境搭建(JDK/Hadoop 部署 + 虚拟机配置 + SSH 免密+Kafka安装启动)
  • CentOS7搭建Hadoop集群
  • Oracle OCP与MySQL OCP认证如何选?
  • 零基础玩转Python生物信息学:数据分析与算法实现
  • Python Flask中启用AWS Secrets Manager+AWS Parameter Store配置中心
  • Go语言爬虫系列教程4:使用正则表达式解析HTML内容
  • dvwa9——Weak Session IDs
  • Redis-旁路缓存策略详解
  • 常见排序算法详解与C语言实现
  • Python网页数据抓取常用的库及方法介绍
  • Python非监督学习
  • 如何轻松地将文件从 PC 传输到 iPhone?
  • 吃透 Golang 基础:数据结构之 Struct
  • 涂胶协作机器人解决方案 | Kinova Link 6 Cobot在涂胶工业的方案应用与价值
  • 四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型
  • 4.1 HarmonyOS NEXT原生AI能力集成:盘古大模型端侧部署与多模态交互实战
  • 在compose中的Canvas用kotlin显示多数据波形闪烁的问题
  • 李飞飞World Labs开源革命性Web端3D渲染器Forge!3D高斯溅射技术首次实现全平台流畅运行
  • VR博物馆推动现代数字化科技博物馆
  • 【Linux】进程 信号保存 信号处理 OS用户态/内核态
  • bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))
  • Flutter面试题