274.H 指数
给你一个整数数组 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
- 将数组逆序排序后,令 h 从 0 开始,论文篇数可以用遍历下标 i 表示,而引用次数可以用 nums[i] 表示,只要符合条件就一直累加 h,否则就返回 h
-
public int hIndex(int[] citations) {Integer[] nums = Arrays.stream(citations).boxed().toArray(Integer[]::new);Arrays.sort(nums, Comparator.reverseOrder());int h=0;for(int i=0;i<nums.length;i++){if(nums[i]>=i+1)h++;else break;}return h;}
- 不用排序:假设论文数量为 n,如果有一个数组 nums,下标 i 表示被引用次数,值 nums[i] 表示被引用次数大于等于 i 的论文数量,那么我们逆序遍历这个 nums 时,只要 nums[i] >= i 就符合 h 指数的判断条件,nums 的获取你可能会觉得需要双重循环
-
int[] nums = [n+1]for(int i=1;i<=n;i++){for(int c:citations){if(c>=i)nums[i]++;}}
- 实际并不需要,我们只要遍历数组先得到被引用数等于 i 的每个论文数量,超过 n 的按照 n 计算,比如例子 1,我们会得到 nums 为 [1,0,1,0,2],当我们逆序遍历 nums 时,实际上 nums[5] 是真的表示了被引用次数大于等于 5 的论文数量,而按道理
nums[4]
应该等于nums[4]+nums[5]
,nums[3] = nums[3]+nums[4]+nums[5]
…,所以我们可以用变量 sum 记录真正大于等于 i 的论文数量即可,最终代码如下 -
public int hIndex(int[] citations) {int n = citations.length;int[] nums = new int[n+1];// 先得到被引用数等于 i 的论文数for(int c:citations)nums[Math.min(c,n)]++;// 用 sum 记录被引用数大于等于 i 的论文数int sum =0;for(int i=n;;i--){sum += nums[i];if(sum >= i)return i;}}