LeetCode面试经典150题—09 H 指数

文章讨论了三种不同的整数数组排序方法,包括基于升序的快速排序、从后往前的简单遍历以及使用计数排序优化时间复杂度。作者分析了每种方法的时间和空间复杂度,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 排序 从前往后

    首先对数组升序排序,末尾即最大值 max,那么在该数组中 H 可能的最大值就是 max = Math.min(len, citations[len - 1])

    从前往后遍历,在数组中查找大于等于 max 的最小位置,然后计算这样的数有多少个并与 max 进行比较

    为什么是大于等于 max 呢?因为当得到的个数小于当前的 max 时,接下来需要使 max-- 继续查找,而此时 max 的值在数组中不一定存在

    代码如下:
    public static int hIndex(int[] citations) {
        int len = citations.length;
        //时间复杂度:O(n*logn);空间复杂度:O(logn)
        Arrays.sort(citations);
        int max = Math.min(len, citations[len - 1]), index = len - 1;
        while (max > 0) {
            //H 不可能待遇总的论文发表数
            if (max > len) {
                max = len;
                continue;
            }
            for (int i = 0; i < len; i++) {
                if (citations[i] >= max) {
                    index = i;
                    break;
                }
            }
            if ((len - index) >= max)
                return max;
            max--;
            index = len - 1;
        }
        return 0;
    }
  • 排序优化:从后往前
    public static int hIndex(int[] citations) {
        Arrays.sort(citations);
        int h = 0, i = citations.length - 1;
        while (i >= 0 && citations[i] > h) {
            h++;
            i--;
        }
        return h;
    }
  • 计数排序

    前面排序方法的时间空间复杂度依赖于排序算法,考虑将其替换优化

    时间复杂度:O(n)
    空间复杂度:O(n)

    代码如下:
    public static int hIndex2(int[] citations) {
        int len = citations.length, h = 0;
        //新建数组 count,记录当前引用次数对应的论文篇数,count[len] 记录引用数大于等于论文数的情况
        int[] count = new int[len + 1];
        for (int i = 0; i < len; i++) {
            if (citations[i] >= len) {
                count[len]++;
            } else {
                count[citations[i]]++;
            }
        }
        //从后往前查找
        for (int i = len; i >= 0; i--) {
            h += count[i];
            if (h >= i) return i;
        }
        return 0;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值