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

227 篇文章 0 订阅
137 篇文章 0 订阅

一、题目描述

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

三、具体代码

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值