题目:
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 **h 指数。
根据维基百科上 h 指数的定义:h 代表“高引用次数”,一名科研人员的 h指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。
如果 h 有多种可能的值,h 指数** 是其中最大的那个。
算法:
考虑对原始引用数组排序得到:[1,1,4,5,5,5,5] ,从右往左遍历数组,遍历到4时候,我们发现有4篇引用因子为5个文章,H指数为4。H指数=min(论文分数,该分数论文数)。
那么什么时候H指数为最大呢?
1.遍历的论文数>=论文分数。
[1,1,4,5,5,5,5,5,5] ,(论文数6,分数5)
2.遍历的论文数<论文分数, 且H指数开始下降。
从右到左遍历,因为论文数不断增加,根据H指数=min(论文分数,该分数论文数),只有论文分数下降导致H指数下降。[1,1,4,5,5] 。
[5,5] (2篇论文,分数5,H指数2)
[4,5,5] (3篇论文,分数2,H指数3)
[1,4,5,5] (4篇论文,分数1,H指数1) H 指数下降之后是不会再上升的。
所以最大H指数为3。
func hIndex(citations []int) int {
quickSort(citations, 0, len(citations) - 1)
i := len(citations) - 1
h := 2000
for i >= 0 {
if h != citations[i] {
if len(citations) - i >= h || len(citations) - i > citations[i] {
break
}
h = citations[i]
}
i --
}
// len(citations) - 1 - i 代表高度>= h的论文个数
// 如4篇引用次数大于等于5,6篇引用次数大于等于3
return min(len(citations) - 1 - i, h)
}
func quickSort(nums []int, left, right int) {
if left >= right {
return
}
pivot := partition(nums, left, right)
quickSort(nums, left, pivot - 1)
quickSort(nums, pivot + 1, right)
}
func partition(nums []int, left, right int) int {
if left == right {
return left
}
i := left
pivotVal := nums[right]
for j := left; j < right; j ++ {
if nums[j] < pivotVal {
nums[i], nums[j] = nums[j], nums[i]
i ++
}
}
nums[i], nums[right] = nums[right], nums[i]
return i
}
func min(a, b int) int {
if a < b {
return a
}
return b
}