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

力扣网编程274题:H指数之普通解法(中等)

一. 简介

本文记录力扣网上涉及数组,排序方面的编程题:H指数。

二. 力扣网编程274题:H指数(中等)

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。

示例 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

解题思路一:(排序后统计)

题目是寻找最大的 h,使得至少有 h 篇论文被引用 ≥h 次。

首先,对数组进行降序排序,即从大到小排序;

其次,从左向右遍历数组,如果 citations[i]  > h 时,说明至少有 h+1篇文章引用次数 >= (h+1),因此可以安全的将 h自增1;

最后返回 h即为指数。

这种方法利用了排序后的特性:

当遍历到第 i 篇论文时,前面已经有 i 篇论文的引用次数 ≥ citations[i]。

如果 citations[i]  > h 时,说明至少有 h+1篇文章引用次数 >= (h+1)。

可以这里理解上面的特性:

    citations[i]:当遍历到第i个元素值citations[i],表示前 i+1 篇论文的引用次数 ≥ citations[i](降序数组的特性)。
    citations[i] > h,因此:
    前 i+1 篇论文的引用次数必然都 > h(因为它们 ≥ citations[i] > h)。
    此时,至少有 i+1 篇论文的引用次数 > h,即:
    至少有 i+1 篇论文的引用次数 ≥ h+1。


    如果 i+1 ≥ h+1(即当前遍历到的论文数量足够),则说明:
    存在 h+1 篇论文的引用次数 ≥ h+1,因此 H 指数可以更新为 h+1。

举例说明:

举个例子:如果某人有 5 篇论文,引用次数是 [3, 0, 6, 1, 5],排序后为[6,5,3,1,0]
从前往后看:第 1 篇(6)≥ 1 → 至少有 1 篇 ≥ 1第 2 篇(5)≥ 2 → 至少有 2 篇 ≥ 2第 3 篇(3)≥ 3 → 至少有 3 篇 ≥ 3第 4 篇(1)< 4 → 不满足 4 篇 ≥ 4

具体方法如下:

1. 首先初始化一个变量:h=0,来统计指数;

2. 其次,从大到小进行排序;

3. 从前往后遍历数组,判断 citations[i] > h,当满足时,h自增1。

4.循环退出,最后的 h即所求的指数;

C语言实现如下:

//从大到小排序
int small_to_large(const void* a, const void* b) {return *(int*)b- *(int*)a;
}int hIndex(int* citations, int citationsSize) {int i;int h = 0;qsort(citations, citationsSize, sizeof(int), small_to_large);for(i = 0; i < citationsSize; i++) {if(citations[i] > h) {h++;}}return h;
}

可以看出,排序解法的时间复杂度为 O (n log n)。

下一篇文章使用计数排序解法进行处理:

力扣网编程274题:H指数之计数排序(中等)-CSDN博客

http://www.dtcms.com/a/269242.html

相关文章:

  • ExcelJS 完全指南:专业级Excel导出解决方案
  • Web前端——css样式(盒子模型)
  • R语言爬虫实战:如何爬取分页链接并批量保存
  • Docker 稳定运行与存储优化全攻略(含可视化指南)
  • 田间杂草分割实例
  • 【PTA数据结构 | C语言版】求数组与整数乘积的最大值
  • OpenWebUI(2)源码学习-后端retrieval检索模块
  • YMS系统开发2-EAP自动化SECS/GEM协议详解
  • python的瑜伽体验课预约系统
  • vue时间轴,antd时间轴,带卡片时间轴
  • Windows 和 Linux 好用网络命令
  • 【动态规划】两个数组的dp问题(一)
  • 基于 STM32+FPGA 的快速傅里叶频域图像在 TFT 中显示的设计与实现(项目资料)(ID:8)
  • Python Day6
  • 【Netty基础】Java原生网络编程
  • 洛谷刷题7.7
  • Java源码的前端编译
  • tomcat部署多个端口以及制定路径部署-vue3
  • Java创建型模式---原型模式
  • docker进入启动失败的容器
  • 图像处理中的边缘填充:原理与实践
  • AJAX vs axios vs fetch
  • [java: Cleaner]-一文述之
  • Python与Mongo数据库:下载安装mongodb与CompassGUI、python中安装monggo模块、如何在Mongo中插入一条数据
  • 10.5 实战ChatGLM3私有数据微调之提示工程:批量生成数据稳定性秘籍
  • HarmonyOS从入门到精通:自定义组件开发指南(二):组件属性与参数传递
  • Python实现MCP Server的完整Demo
  • 《声音的变形记:Web Audio API的实时特效法则》
  • Web 前端安全防护:防范常见攻击与漏洞的策略
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑7和8