题干:
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。
解法1:排序
func hIndex(citations []int) (h int) {
sort.Ints(citations)
for i := len(citations) - 1; i >= 0 && citations[i] > h; i-- {
h++
}
return
}
首先,使用 sort.Ints(citations) 对引用次数数组进行升序排序。这样做的目的是为了让引用次数从小到大排列,方便后续处理。
初始化 h 指数:函数返回值 h 初始值为 0。
遍历排序后的数组:从数组的末尾开始向前遍历(即从最高的引用次数开始检查),使用 for i := len(citations) - 1; i >= 0 && citations[i] > h; i-- 这个循环来遍历数组。这里的 i >= 0 && citations[i] > h 是退出条件,当遍历到某个位置 i,并且 citations[i] 小于等于 h 时,循环就会停止。
更新 h 指数:在每次循环迭代中,如果当前引用次数 citations[i] 大于 h,那么增加 h 的值。这实际上是说,如果我们找到了至少 h 篇论文,它们都有至少 h 次引用,那么 h 可以递增。
返回结果:当遍历完成之后,返回 h 的值作为 h 指数。
解析:
1.为什么从后向前遍历?
因为我们希望找到最大的 h,使得至少有 h 篇论文被引用了至少 h 次。从后向前遍历保证了我们能找到最大的 h。
2.为什么要使用升序排序而不是降序排序?
实际上,这里使用升序排序是可行的,因为在每次迭代中我们都是检查当前引用次数是否大于 h。如果是,那么说明从当前位置往后的所有论文(包括当前位置)都有至少 h 次引用,因此 h