275.H 指数 II
【LetMeFly】275.H 指数 II
力扣题目链接:https://leetcode.cn/problems/h-index-ii/
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数,citations
已经按照 升序排列 。计算并返回该研究者的 h
指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n
篇论文中)总共有 h
篇论文分别被引用了至少 h
次。且其余的 n - h
篇论文每篇被引用次数 不超过 h
次。
提示:如果 h
有多种可能的值,h
指数 是其中最大的那个。
请你设计并实现对数时间复杂度的算法解决此问题。
示例 1:
输入:
citations = [0,1,3,5,6]
输出:3 解释:给定数组表示研究者总共有5
篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6
次。 由于研究者有3
篇论文每篇 至少 被引用了3
次,其余两篇论文每篇被引用 不多于3
次,所以她的 h 指数是3
。
示例 2:
输入:citations = [1,2,100] 输出:2
提示:
n == citations.length
1 <= n <= 105
0 <= citations[i] <= 1000
citations
按 升序排列
方法一:遍历
因为原始数组已经是排好序的了,因此越往后的论文引用次数就越高。
我们只需要从前往后遍历一遍数组,当遍历到第$i$个元素时,如果后面$n-i$篇论文的引用次数都大于等于$n-i$,就说明$n-i$是一个h指数
。
因数组是升序的,所以后面$n-i$篇论文的引用次数都大于等于$n-i$ 等价于 第$i$篇论文的引用量大于等于$n-i$
第一个合法的h指数
就是最大的h
- 时间复杂度$O(n)$,其中$n$是数组中元素的个数
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
方法二:二分
与方法一同理,如果$n-i\geq citations[i]$,那么$n-i$就是一个合法的h
并且如果$n-i$是h
,那么$n - i - 1$、$n - i - 2$、$\cdots$都是合法的h
我们要找的就是最大的合法h
显然,二分很合适。
初始时$l$指向合法区间的第一个元素$0$,$r$指向合法区间的后一个元素$n$($n$不合法)
当$l < r$时,如果二者中值$mid$合法,就令$r=mid$,否则令$l=mid+1$
最终$n-l$即为答案
- 时间复杂度$O(\log n)$,其中$n$是数组中元素的个数
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126851266