一、题目描述
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数,citations
已经按照 升序排列 。计算并返回该研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 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 按 升序排列
二、代码
代码如下:
import numpy as np
class Solution:
def hIndex(self, citations: List[int]) -> int:
h = len(citations)
c = np.array(citations)
left = 1
right = h
result = 0
print(c)
if np.sum(c - right >= 0) >= right:
return right
if np.sum(c - left >= 0) < left:
return result
while (left <= right):
mid = int((left + right) / 2)
print(f"now left:{left} right:{right} mid:{mid}")
if mid <= np.sum(c - mid >= 0):
print("走右")
left = mid + 1
result = mid
continue
if np.sum(c - mid >= 0) < mid:
print("走左")
if left <= np.sum(c - mid >= 0):
result = left
right = mid - 1
continue
print("result:",result)
return result
三、解题思路
本题解的大致思路为采用二分查找的方法去寻找符合条件的最大h指数,尽可能缩小寻找h指数的次数以满足题意。具体思路为在1~len(citations)
之间寻找一个最大的整数满足h指数的定义,这一寻找过程可以使用二分查找的方式进行查找。