[LeetCode] H-Index

简介: If you've read the Wikipedia article of H-Index, there is already a neat formula there for computing the h-index, which is written below using the notations of the problem.

If you've read the Wikipedia article of H-Index, there is already a neat formula there for computing the h-index, which is written below using the notations of the problem. Note that in the formula below, citations is sorted in descending order and i is 1-indexed.

h = max_i(min(i, citations[i]))

Now you will easily write down the following code.

 1 class Solution {
 2 public:
 3     int hIndex(vector<int>& citations) {
 4         sort(citations.rbegin(), citations.rend());
 5         int h = 0, i = 0;
 6         for (int c : citations)
 7             h = max(h, min(++i, c));
 8         return h;
 9     }
10 };

This code takes 20ms. In fact, rbegin and rend seems to be relatively slow. An alternative is to sort citations in normal ascending order and then count all those papers with citations larger than their indexes, as what Stefan does here. Now the code runs in 12ms.

 1 class Solution {
 2 public:
 3     int hIndex(vector<int>& citations) {
 4         sort(citations.begin(), citations.end()); 
 5         int h = 0, i = citations.size();
 6         for (int c : citations)
 7             h += (c > --i);
 8         return h;
 9     }
10 };

Well, both the above codes are in O(nlogn) time. Is there a linear time solution? The answer is yes: refer to this post if you like :-)

 1 class Solution {
 2 public:
 3     int hIndex(vector<int>& citations) {
 4         int n = citations.size(), h = 0;
 5         int* counts = new int[n + 1]();
 6         for (int c : citations)
 7             counts[min(c, n)]++;
 8         for (int i = n; i; i--) {
 9             h += counts[i];
10             if (h >= i) return i;
11         } 
12         return h;
13     }
14 };

This code uses both linear time and space, and runs in 8ms. Wow, we've moved a long way from the original 20ms version :-)

目录
相关文章
|
算法 索引
LeetCode 275. H-Index II
给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列。编写一个方法,计算出研究者的 h 指数。
73 0
LeetCode 275. H-Index II
LeetCode 274. H-Index
给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。
72 0
LeetCode 274. H-Index
|
索引
LeetCode 274 H-Index (H索引)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/51753099 翻译 给定一个研究者的引用数(每个引用都是非负数)的数组,写一个函数用于计算研究者的h索引。
872 0
[LeetCode] H-Index
Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher’s h-index. According to the definition of h-index on Wikip
1105 0
[LeetCode] H-Index II
Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm? Hint: Expected runtime complexity is in O(log n) and the input is sort
1011 0
|
移动开发
[LeetCode] H-Index II
This problem is designed specifically to use binary search. In fact, in H-Index, someone has already used this idea (you may refer to this post :-)) The code is as follows.
718 0
|
23天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
23天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题