g0201_0300.s0275_h_index_ii.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java21 Show documentation
Show all versions of leetcode-in-java21 Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
package g0201_0300.s0275_h_index_ii;
// #Medium #Array #Binary_Search #Binary_Search_II_Day_8
// #2022_07_06_Time_0_ms_(100.00%)_Space_52.9_MB_(13.67%)
/**
* 275 - H-Index II\.
*
* Medium
*
* Given an array of integers `citations` where `citations[i]` is the number of citations a researcher received for their ith
paper and `citations` is sorted in an **ascending order** , return compute the researcher's `h` **\-index**.
*
* According to the [definition of h-index on Wikipedia](https://en.wikipedia.org/wiki/H-index): A scientist has an index `h` if `h` of their `n` papers have at least `h` citations each, and the other `n − h` papers have no more than `h` citations each.
*
* If there are several possible values for `h`, the maximum one is taken as the `h` **\-index**.
*
* You must write an algorithm that runs in logarithmic time.
*
* **Example 1:**
*
* **Input:** citations = [0,1,3,5,6]
*
* **Output:** 3
*
* **Explanation:** [0,1,3,5,6] means the researcher has 5 papers in total and each of them had received 0, 1, 3, 5, 6 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, their h-index is 3.
*
* **Example 2:**
*
* **Input:** citations = [1,2,100]
*
* **Output:** 2
*
* **Constraints:**
*
* * `n == citations.length`
* * 1 <= n <= 105
* * `0 <= citations[i] <= 1000`
* * `citations` is sorted in **ascending order**.
**/
public class Solution {
public int hIndex(int[] citations) {
int lo = 1;
int hi = 1000;
int ans = 0;
while (lo <= hi) {
int mid = (lo + hi) / 2;
int p = check(mid, citations);
if (citations.length - p >= mid) {
ans = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return ans;
}
private int check(int v, int[] arr) {
int lo = 0;
int hi = arr.length - 1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (arr[mid] < v) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return lo;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy