Question
Formatted question description: https://leetcode.ca/all/274.html
274 HIndex
Given an array of citations (each citation is a nonnegative integer) of a researcher,
write a function to compute the researcher's hindex.
According to the definition of hindex 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."
Example:
Input: citations = [3,0,6,1,5]
Output: 3
Explanation: [3,0,6,1,5] 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, her hindex is 3.
Note: If there are several possible values for h, the maximum one is taken as the hindex.
Algorithm
 Sort all SCI papers published by him in descending order of the number of citations;
 Search the sorted list from front to back until the serial number of a paper is greater than the number of times the paper has been cited.
The obtained serial number minus one is the H index
Code
Java

public class H_Index { class Solution { public int hIndex(int[] citations) { if (citations == null  citations.length == 0) { return 0; } // @note Arrays.sort(citations); // 6,5,3,1,0 for (int i = 0; i < citations.length / 2; ++i) { int temp = citations[i]; citations[i] = citations[citations.length  i  1]; citations[citations.length  i  1] = temp; } for (int i = 0; i < citations.length; ++i) { if (citations[i] <= i) { // @note: <i then return i+1 will not work return i; } } return citations.length; } } }

// OJ: https://leetcode.com/problems/hindex/ // Time: O(NlogN) // Space: O(1) class Solution { public: int hIndex(vector<int>& A) { sort(begin(A), end(A)); int L = 0, R = A.size()  1, N = A.size(); while (L <= R) { int M = (L + R) / 2; if (A[M] < N  M) L = M + 1; else R = M  1; } return N  L; } };

class Solution(object): def hIndex(self, citations): """ :type citations: List[int] :rtype: int """ n = len(citations) dp = [0] * (n + 1) for c in citations: if c > n: dp[n] += 1 else: dp[c] += 1 total = 0 for i in reversed(range(1, len(dp))): total += dp[i] if total >= i: return i return 0