給一個升序排列的非零非負的整數數列 citations , citations[i] 代表第 i 篇論文的引文次數。
找出一個 H-Index 代表至少有 n 篇被引用 n 次,要取最大值回傳。
這是一個 Rank 的排序與篩選,可以想像從 1 開始,如果有 1 篇大於 1 次就往下進行,換成看 2 。
因為是數目也是條件,所以加上計數,如果慢慢往上加到當 citations[i] > n - i 時,那就代表不合格。
題目有提示用 O(logN) Time 解決,有個經典的方式是這樣的時間複雜度:二分搜查法。
二分搜查法要切在左方合格,右方不合格的位置,最後選擇右界。
那 H-Index 是 citations[r] 嗎?不是。
在右界與之後都是 >= citations[r] 的,也就是有 n - r 篇,H-Index 的 n 篇 n 次,若有不同,也只能取 n - r 和 citations[r] 小的為主,這樣子的 H-Index 才能合要求。
不過二者的大小關係是 citations[r] >= n - r ,然後要取小為主所以 H-Index 為 n - r。
class Solution: def hIndex(self, citations: List[int]) -> int: if not citations: return 0 n = len(citations) l, r = 0, n while l < r: m = (r-l)//2 + l if citations[m] >= n-m: r = m else: l = m + 1 return n-rC#
public class Solution { public int HIndex(int[] citations) { int l = 0; int r = citations.Length; while(l < r) { int m = (r-l)/2 + l; if(citations[m] >= citations.Length - m) r = m; else l = m + 1; } return citations.Length - r; } }testcase
[100] [] [1] [0,1,3,5,6] [0,1,2,5,6]