一、题目描述:
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
根据维基百科上 h 指数的定义:h 代表“高引用次数”,一名科研人员的 h指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - 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
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/h-…
二、思路分析:
首先理解题意, h指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次,可以理解为:h 指数指可以把一个研究者的论文被引用的次数 按照升序排序,找的是一条分割线,分割线右边的所有论文的引用次数都很高,并且:分割线右边的最少引用次数 >= 分割线右边的论文篇数。最后题目要求返回的是论文数量,所以可以使用2分查找法 首先确认边界:H指数要求发表的篇数,所以一定不会大于总篇数 所以范围是 0-N
- 如果论文引用次数 >= 当前引用次数,符合要求的篇数+1
- 如果符合要求篇数>=引用次数,则当前值可以为H指数
三、AC 代码:
class Solution { public int hIndex(int[] citations) { int n=citations.length; int l=0,r=n; while(l<=r){ int mid = l + (r-l)/2; if(check(citations,mid)){ l=mid+1; }else{ r=mid-1; } } return r; } public boolean check(int[] citations, int mid) { int count=0; for (int citation : citations) { if(citation>=mid){ count++; } } return count>=mid; } }
四、总结:
网络异常,图片无法展示
|