文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【解题思路】
- 七【题目提示】
- 八【时间频度】
- 九【代码实现】
- 十【提交结果】
一【题目类别】
- 二分查找
二【题目难度】
- 中等
三【题目编号】
- 275.H 指数 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
六【解题思路】
- 本题最重要的是理解题意,要明白我们努力的目标是什么。很明显,题目要求我们在一个升序数组中,找到一个数字,这个数字右边的数字个数加上本数字的总个数刚好等于本数字的值,所以我们每次只需要和本数字右边的数字个数加上本数字的总个数比较就行了
- 如果本数字右边的数字个数加上本数字的总个数小于或等于本数字的值:向左搜索,说明我们需要的值在数组的左边
- 如果本数字右边的数字个数加上本数字的总个数大于本数字的值:向右搜索,说明我们需要的值在数组的右边
- 找到目标数字后,再按照题目的定义,返回其个数即可
- 需要注意特殊情况需要判断,当找到的值不合法时,需要返回0
七【题目提示】
- n = = c i t a t i o n s . l e n g t h n == citations.length n==citations.length
- 1 < = n < = 1 0 5 1 <= n <= 10^5 1<=n<=105
- 0 < = c i t a t i o n s [ i ] < = 1000 0 <= citations[i] <= 1000 0<=citations[i]<=1000
- c i t a t i o n s 按升序排列 citations 按 升序排列 citations按升序排列
八【时间频度】
- 时间复杂度: O ( l o g n ) O(logn) O(logn),其中 n n n为数组的长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
class Solution {
public int hIndex(int[] citations) {
int len = citations.length;
int left = 0;
int right = len - 1;
while(left < right){
int mid = (left + right) / 2;
if(citations[mid] >= len - mid){
right = mid;
}else{
left = mid + 1;
}
}
return citations[right] >= len - right ? len - right : 0;
}
}
- C语言版
int hIndex(int* citations, int citationsSize)
{
int len = citationsSize;
int left = 0;
int right = len - 1;
while(left < right)
{
int mid = (left + right) / 2;
if(citations[mid] >= len - mid)
{
right = mid;
}
else
{
left = mid + 1;
}
}
return citations[right] >= len - right ? len - right : 0;
}
- Python版
class Solution:
def hIndex(self, citations: List[int]) -> int:
n = len(citations)
left = 0
right = n - 1
while left < right:
mid = (left + right) // 2
if citations[mid] >= n - mid:
right = mid
else:
left = mid + 1
return n - right if citations[right] >= n - right else 0
十【提交结果】
-
Java语言版
-
C语言版
-
Python语言版