H-Index II

medium array binary search

Problem

citations is sorted in non-decreasing order. The h-index is the largest h such that at least h papers each have ≥ h citations. Compute it in O(log n).

Inputcitations = [0, 1, 3, 5, 6]
Output3
3 papers have ≥ 3 citations (3, 5, 6).

def hIndex(citations):
    n = len(citations)
    lo, hi = 0, n - 1
    while lo <= hi:
        mid = (lo + hi) // 2
        if citations[mid] >= n - mid:
            hi = mid - 1
        else:
            lo = mid + 1
    return n - lo
function hIndex(citations) {
  const n = citations.length;
  let lo = 0, hi = n - 1;
  while (lo <= hi) {
    const mid = (lo + hi) >> 1;
    if (citations[mid] >= n - mid) hi = mid - 1;
    else lo = mid + 1;
  }
  return n - lo;
}
class Solution {
    public int hIndex(int[] citations) {
        int n = citations.length, lo = 0, hi = n - 1;
        while (lo <= hi) {
            int mid = (lo + hi) >>> 1;
            if (citations[mid] >= n - mid) hi = mid - 1;
            else lo = mid + 1;
        }
        return n - lo;
    }
}
class Solution {
public:
    int hIndex(vector<int>& citations) {
        int n = citations.size(), lo = 0, hi = n - 1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            if (citations[mid] >= n - mid) hi = mid - 1;
            else lo = mid + 1;
        }
        return n - lo;
    }
};
Time: O(log n) Space: O(1)