先来理解一下这道题目
简单来说,寻一个最大的符合条件的数;条件:至少有h篇citation至少为h的paper
eg1. [3,0,6,1,5] -> [0,1,3,5,6]
至少有6篇citation至少为6的paper(其实只有1篇,[6]) -> NO
至少有5篇citation至少为5的paper(其实只有2篇,[5,6]) -> NO
至少有3篇citation至少为3的paper(其实有3篇,[3,5,6]) -> YES -> ANSWER
但其实我们并不需要考虑6的情况,因为一共只有5篇,不可能有6篇citaition为6的paper
eg2. [7,8,8,8]
我们可以从array size开始,
至少有4篇citation至少为4的paper([7,8,8,8]) -> YES -> ANSWER
Sort O(nlogn) + O(n)
Sort之后我们可以知道什么?从后往前遍历,n-i为大于当前citation的篇数
[0,0,4,4]
i=3, citations[i] = 4, n-i = 1 -> 至少有1篇citation至少为4的paper -> 至少有1篇citation至少为1的paper
i=2, citations[i] = 4, n-i = 2 -> 至少有2篇citation至少为4的paper -> 至少有2篇citation至少为2的paper
i=1, citations[i] = 0, n-i = 3 -> 至少有3篇citation至少为0的paper -> stop
class Solution:
def hIndex(self, citations: List[int]) -> int:
if not citations: return 0
citations.sort()
res, n = 0, len(citations)
for i in range(n-1, -1, -1):
if(n-i<=citations[i]):
res = n-i
else:
break
return res
BucketSort O(n)
class Solution:
def hIndex(self, citations: List[int]) -> int:
N = len(citations)
cnts = [0] * (N + 1)
for c in citations:
cnts[[c, N][c > N]] += 1
sums = 0
for h in range(N, 0, -1):
sums += cnts[h]
if sums >= h:
return h
return 0
本文深入探讨了H-Index算法的实现,通过排序和桶排序两种方法,详细讲解了如何在给定引用次数列表中找到最大符合条件的H值。通过实例演示了算法的运行过程,帮助读者理解算法背后的逻辑。
159

被折叠的 条评论
为什么被折叠?



