力扣网编程274题:H指数之普通解法(中等)

一. 简介

本文记录力扣网上涉及数组,排序方面的编程题:H指数。

二. 力扣网编程274题:H指数(中等)

给你一个整数数组 citations ,其中 citationsi 表示研究者的第 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

解题思路一:(排序后统计)

题目是寻找最大的 h,使得至少有 h 篇论文被引用 ≥h 次。

首先,对数组进行降序排序,即从大到小排序;

其次,从左向右遍历数组,如果 citationsi > h 时,说明至少有 h+1篇文章引用次数 >= (h+1),因此可以安全的将 h自增1;

最后返回 h即为指数。

这种方法利用了排序后的特性:

当遍历到第 i 篇论文时,前面已经有 i 篇论文的引用次数 ≥ citationsi。

如果 citationsi > h 时,说明至少有 h+1篇文章引用次数 >= (h+1)。

可以这里理解上面的特性:

citationsi: 当遍历到第i个元素值citationsi,表示前 i+1 篇论文的引用次数 ≥ citationsi(降序数组的特性)。
citationsi > h ,因此:
前 i+1 篇论文的引用次数必然都 > h(因为它们 ≥ citationsi > h)。
此时,至少有 i+1 篇论文的引用次数 > h,即:
至少有 i+1 篇论文的引用次数 ≥ h+1。

如果 i+1 ≥ h+1(即当前遍历到的论文数量足够),则说明:
存在 h+1 篇论文的引用次数 ≥ h+1,因此 H 指数可以更新为 h+1。

举例说明:

复制代码
举个例子:如果某人有 5 篇论文,引用次数是 [3, 0, 6, 1, 5],排序后为[6,5,3,1,0]
从前往后看:
    第 1 篇(6)≥ 1 → 至少有 1 篇 ≥ 1
    第 2 篇(5)≥ 2 → 至少有 2 篇 ≥ 2
    第 3 篇(3)≥ 3 → 至少有 3 篇 ≥ 3
    第 4 篇(1)< 4 → 不满足 4 篇 ≥ 4

具体方法如下:

  1. 首先初始化一个变量:h=0,来统计指数;

  2. 其次,从大到小进行排序;

  3. 从前往后遍历数组,判断 citationsi > h,当满足时,h自增1。

4.循环退出,最后的 h即所求的指数;

C语言实现如下:

复制代码
//从大到小排序
int small_to_large(const void* a, const void* b) {
    return *(int*)b- *(int*)a;
}

int hIndex(int* citations, int citationsSize) {
    int i;
    int h = 0;
    qsort(citations, citationsSize, sizeof(int), small_to_large);

    for(i = 0; i < citationsSize; i++) {
        if(citations[i] > h) {
            h++;
        }
    }
    return h;
}

可以看出,排序解法的时间复杂度为 O (n log n)。

下一篇文章使用计数排序解法进行处理:

力扣网编程274题:H指数之计数排序(中等)-CSDN博客

相关推荐
荆棘鸟智能26 分钟前
河道采砂船识别与轨迹追踪怎么做?检测、跟踪与电子围栏实战思路
人工智能·算法·目标检测
DFT计算杂谈1 小时前
GSAS-II X 射线衍射(XRD)数据转换为对分布函数(PDF,Pair Distribution Function)
算法·机器学习·pdf
绕灵儿1 小时前
火灾检测-应用场景-YOLO训练记录
人工智能·算法
YLCHUP1 小时前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
(●—●)橘子……2 小时前
力扣 第525场周赛 练习理解
数据结构·python·学习·算法·leetcode
Rain的Java大神之路2 小时前
LeetCode 21 合并两个有序链表:一道 Easy 题,凭什么刷掉一半候选人?
java·后端·算法
小蒋观天下2 小时前
太阳能低功耗AI相机专项:AOV值守、唤醒时序、ISP启停时序BUG
深度学习·数码相机·算法·机器学习
wenyq72 小时前
LeetCode 152. Maximum Product Subarray
java·算法·leetcode
余额瞒着我当琳2 小时前
C++异常,异常的概念,异常抛出与捕获,RAII 和智能指针的设计思路,C++标准库一些指针的使用
java·开发语言·c++·算法
2601_970703832 小时前
除湿机原理研究报告:一台机器在物理上能走多远
大数据·数据结构·算法·数据库架构·推荐算法