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