Python每日一练---第九天:H指数
前言📢📢
Python每日一练来啦,本文已收录于:《Python每日一练》专栏
此专栏目的在于,帮忙学习Python的小白提高编程能力,训练逻辑思维,持续更新中,欢迎免费订阅!!!
-
1. 问题描述
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。
示例 1:
输入:citations = [3,0,6,1,5] 输出:3 解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。 由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
示例 2:
输入:citations = [1,3,1]
输出:1
提示:
-
n == citations.length
-
1 <= n <= 5000
-
0 <= citations[i] <= 1000
-
2. 问题分析
H指数的定义是:一个研究者有h篇论文,每篇至少被引用n次,并且剩下的论文被引用次数不超过h次。
换句话说,就是找数组中,有n个数大于n。
-
3. 算法思路
对于每个候选的 h 值:
(1)计算允许的"低引用"论文数:leftMaxCount = n - h
-
因为至少要有 h 篇论文引用次数 ≥ h,所以最多只能有 n-h 篇论文引用次数 < h
(2)统计实际"低引用"论文数:遍历数组,统计引用次数 < h 的论文数量
(3)验证条件:如果实际低引用论文数 ≤ 允许的低引用论文数,说明满足 h 指数条件
-
4. 代码实现
from typing import Listclass Solution:def hIndex(self, citations: List[int]) -> int:n = len(citations)maxN = n # h指数最大可能值是n(论文总数)# 从最大可能的h值n开始,递减到1for max in range(maxN, 0, -1):leftMaxCount = n - max # 允许引用次数小于h的论文数量count = 0 # 统计实际引用次数小于h的论文数量# 遍历所有论文for i in range(n):if citations[i] < max:count += 1 # 统计引用次数小于h的论文# 如果已经超过允许的数量,提前退出if count > leftMaxCount:break# 检查是否满足条件if count <= leftMaxCount:return max # 找到最大的h值return 0 # 如果没有找到,返回0if __name__ == '__main__':print(Solution().hIndex([3,0,6,1,5]))print(Solution().hIndex([1,3,1]))print(Solution().hIndex([0]))
