【Golang】LeetCode面试经典150题:274. H 指数

题干:

        给你一个整数数组 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值