[Java·算法·中等] LeetCode274. H指数 详细解读

简介: [Java·算法·中等] LeetCode274. H指数 详细解读

题目

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 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

提示

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

👉️ 力扣原文

class Solution {
    public int hIndex(int[] citations) {
        Arrays.sort(citations);
        int h=0;
        int i= citations.length-1;
        while(i>=0 && citations[i]>h){
            i--;
            h++;
        }
        return h;
    }
}

详细解读

让我们逐行解读这段代码:

  1. Arrays.sort(citations); - 首先,对引用次数数组 citations 进行升序排序。这是为了方便后续的计算。
  2. int h = 0; - 初始化 h 为0,表示初始的H指数。
  3. int i = citations.length - 1; - 初始化变量 i 为数组的最后一个元素的索引,即最大引用次数的索引。
  4. 进入while 循环,条件i >= 0 && citations[i] > h 表示只要当前论文的引用次数大于 h 且还有论文可以考虑,就继续循环。
  5. i - -;- 每次循环,将 i 减1,表示考虑下一篇引用次数更低的论文。
  6. h++; - 同时,将 h 增加1,表示考虑了一篇引用次数至少为 h 的论文。
  7. 循环继续,直到不再满足循环条件,这意味着没有更多的论文可以考虑或者当前的引用次数已经不足以使 h 继续增加。
  8. 最终,返回 h,它代表了H指数,即最大的 h 值,使得至少有 h 篇论文的引用次数不低于 h

这段代码的时间复杂度主要来自数组的排序,排序算法的时间复杂度为 O(nlogn),其中 n 是引用次数数组的长度。然后,在循环中遍历数组,所以总体时间复杂度是 O(nlogn)。这个算法有效地解决了H指数问题,找到了最大的 h 值。

相关文章
|
16天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
50 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
26天前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
37 0
|
13天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
20 2
|
18天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
65 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
22天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
50 2
|
18天前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
47 0
|
26天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
15 0
|
3月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
59 2
|
3月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
6月前
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
169 0