274.H 指数

136 阅读1分钟

题目:
给你一个整数数组 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篇引用次数大于等于56篇引用次数大于等于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
}