LeetCode 274. H-Index
274. H-Index
Description Submission Solutions
- Total Accepted: 65025
- Total Submissions: 200494
- Difficulty: Medium
- Contributors: Admin
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 Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N − h papers have no more than h citations each."
For example, given citations = [3, 0, 6, 1, 5], which means the researcher has 5 papers in total and each of them had received 3, 0, 6, 1, 5 citations respectively. Since the researcher has 3 papers with at least 3 citations each and the remaining two with no more than 3 citations each, his h-index is 3.
Note: If there are several possible values for h, the maximum one is taken as the h-index.
Hint:
- An easy approach is to sort the array first.
- What are the possible values of h-index?
- A faster approach is to use extra space.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
Subscribe to see which companies asked this question.
【题目分析】
给定一个研究者的论文引用量数组,返回一个数h,h满足:在数组中至少有h个数大于等于h,剩下的数都小于等于h。如果存在多个h,则返回使得条件成立的最大的那个。
【思路】
一开始看到这个题目,感觉被整晕了。下面我们来捋一下思路。
1. h的取值范围为0~L,L为数组的长度。例如:h=L,那么数组中所有的元素都大于等于数组的长度。h=0,表明数组中所有元素都小于1。
2. 我们可以对数组进行升序排序,然后遍历所有h的可能。选定一个h,那么排序后的数组后面的h个数要大于等于h,而前L-h个数要小于等于h。由于使用了排序,这个算法的时间复杂度为O(nlogn).
3. 如果不使用排序的话,一个巧妙的思路如下。我们使用一个count[L+1]数组来记录原数组中大于等于某个长度的元素的个数。count[i]表示数组中大于等于i的元素的个数。
We first create a new vector counts of size L+1 where L is the length of the citations vector. The counts vector stores the number of papers having a citation equal to its index for i=0 to L-1. For i=L, it stores the number of papers having a citation equal to or greater than L. A simple fact is that the h-index can be at most L, this happens when all of his papers have citations no less than L. Therefore, for the purpose of computing h-index, if a person has L papers, it would end up with the same h-index no matter one of his paper has a citation of 10L or L.
After finalizing the counts vector, we can then easily locate his h-index by scanning from right (L) to left (0). By definition, index k is his h-index if the summation of all elements from counts[k] to counts[L] is no less than k.
【java代码——排序】
1 public class Solution { 2 public int hIndex(int[] citations) { 3 if(citations.length <= 0) return 0; 4 Arrays.sort(citations); 5 int len = citations.length; 6 7 if(citations[len-1] <= 0) return 0; 8 if(citations[0] >= len) return len; 9 10 for(int i = len-1; i >= 1; i--) { 11 if(citations[len-1-i] <= i && citations[len-i] >= i) return i; 12 } 13 14 return 0; 15 } 16 }
【java代码——非排序】
1 public class Solution { 2 public int hIndex(int[] citations) { 3 int L = citations.length; 4 if(L == 0) return 0; 5 6 int[] count = new int[L+1]; 7 for(int i : citations) { 8 if(i > L) count[L]++; 9 else count[i]++; 10 } 11 12 int res = 0; 13 for(int k = L; k >= 0; k--) { 14 res += count[k]; 15 if(res >= k) return k; 16 } 17 18 return 0; 19 } 20 }

浙公网安备 33010602011771号