LeetCode题练习与总结:H 指数--274

一、题目描述

给你一个整数数组 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

提示:

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

二、解题思路

  1. 首先对数组进行降序排序。
  2. 遍历排序后的数组,寻找满足条件的最长序列:序列中的每个元素的值都大于或等于序列的长度。
  3. 该序列的长度即为所求的 h 指数。

三、具体代码

java 复制代码
import java.util.Arrays;

class Solution {
    public int hIndex(int[] citations) {
        // 对数组进行降序排序
        Arrays.sort(citations);
        int n = citations.length;
        for (int i = 0; i < n; i++) {
            // 从后往前遍历,检查当前索引位置的值是否大于等于剩余论文的数量
            if (citations[n - 1 - i] < i + 1) {
                return i;
            }
        }
        // 如果所有论文的引用次数都大于等于论文的数量,则 h 指数为论文的数量
        return n;
    }
}

代码解析:

  1. 使用 Arrays.sort(citations); 对数组进行升序排序,因为 Java 默认的排序是升序的。
  2. 使用一个 for 循环,从 0 开始遍历数组。
  3. 在循环内部,通过 citations[n - 1 - i] 访问降序排列后的元素(由于是升序排序,所以从后往前遍历相当于降序)。
  4. 检查当前元素的值是否小于其位置索引加 1(位置索引加 1 表示至少有这么多篇论文的引用次数大于等于这个数)。
  5. 如果当前元素的值小于位置索引加 1,则找到了 h 指数,返回索引值。
  6. 如果遍历结束都没有找到这样的值,则 h 指数为论文总数,返回 n。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 排序操作:Arrays.sort(citations); 通常使用的是快速排序或归并排序,其平均时间复杂度为 O(n log n),其中 n 是数组 citations 的长度。
  • for 循环:循环遍历整个数组一次,时间复杂度为 O(n)。

因此,总的时间复杂度是 O(n log n) + O(n),可以简化为 O(n log n),因为 O(n log n) 是主导项。

2. 空间复杂度
  • 排序操作:如果使用的是原地排序算法(如快速排序),则除了输入数组外,只需要常数级别的额外空间,即 O(1)。
  • for 循环:只使用了几个额外的变量(如 n 和循环变量 i),这些变量占用的空间是常数级别的,即 O(1)。

因此,总的空间复杂度是 O(1),表示算法在执行过程中使用了固定的额外空间,与输入数组的大小无关。

五、总结知识点

  1. 类定义 :class Solution:定义了一个名为 Solution 的类。

  2. 方法定义 :public int hIndex(int[] citations):定义了一个名为 hIndex 的公共方法,它接受一个整数数组 citations 作为参数,并返回一个整数。

  3. 数组排序 :Arrays.sort(citations);:使用 java.util.Arrays 类中的 sort 方法对整数数组 citations 进行排序。默认情况下,这个方法按照升序对数组进行排序。

  4. 变量声明和初始化 :int n = citations.length;:声明了一个整型变量 n 并将其初始化为数组 citations 的长度。

  5. 循环结构 :for (int i = 0; i < n; i++):使用 for 循环结构遍历数组。变量 i 从 0 开始,每次循环递增,直到它小于 n。

  6. 条件判断 :if (citations[n - 1 - i] < i + 1):在 for 循环内部使用 if 语句进行条件判断。这里检查的是数组中从后往前数的第 i 个元素的值是否小于 i + 1。

  7. 数组元素访问 :citations[n - 1 - i]:通过索引访问数组元素。由于数组是升序排序的,所以 n - 1 - i 实际上是从后往前访问数组。

  8. 方法返回值 :return i; 和 return n;:根据条件判断的结果,方法返回一个整数值,表示 h 指数。

  9. 算法逻辑:代码实现了 h 指数的计算逻辑,即找到至少有 h 篇论文,每篇论文被引用次数至少为 h 的最大 h 值。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关推荐
企业数字化笔记1 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
金銀銅鐵2 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
?abc!2 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
AI人工智能+电脑小能手2 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck3 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428044 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
小郎君6584 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧4 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm4 小时前
40 二叉树的直径
c++·leetcode
考虑考虑5 小时前
JDK26的JEP 500属性
java·后端·java ee