这是索引二分的第十篇算法,力扣链接
给你一个整数数组
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 。
这道题和上一次的H 指数 十分类似,最大的区别是这回是有序排列的了。自然,简单了很多。
但是本着不水每一篇文章的原则,这里还是简单的分析一下。
老规矩,先上暴力法。
再次强调,这里的h不一定是数组里的值,而是具体根据citations数组长度而定的。
h满足 h <= n 且 citations[i] < h 的个数 < h
从右到左遍历,每次都进行h++,当h的个数大于等于citations[i]的时候返回。这样保证了citations[i] 大于
的个数大于 h, 且默认满足 h <=n 。
func hIndex(citations []int) int {result := 0for i:=len(citations) - 1 ; i>=0 ; i-- {if result < citations[i] {result++}}return result
}
然后尝试一下二分法解决这个问题。
还是之前的说法,二分法找的并不是数组里的值,实际上是这个数组的长度的二分查找。
我们根据每一次mid的值去数组里面查找比mid大的个数来去判断mid应该移动的位置。
func hIndex(citations []int) int {l, r := 0, len(citations)for l <= r {mid := l + (r-l)/2count := 0for _, citation := range citations {if citation >= mid {count++}}if count >= mid {l = mid + 1} else {r = mid - 1}}return r
}