[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 值。

相关文章
|
4月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
732 35
|
4月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
4月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
7月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
178 5
|
6月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
283 0
|
7月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
291 0
|
4月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
463 0
|
4月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
314 2
|
5月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
296 3
|
4月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
237 8