###### tags: `LeetCode` `Medium`
# LeetCode #275 [H-Index II](https://leetcode.com/problems/h-index-ii)
### (Medium)
給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數,citations 已經按照 升序排列 。計算並返回該研究者的 h 指數。
h 指數的定義:h 代表“高引用次數”(high citations),一名科研人員的 h 指數是指他(她)的 (n 篇論文中)總共有 h 篇論文分別被引用了至少 h 次。且其餘的 n — h 篇論文每篇被引用次數 不超過 h 次。
提示:如果 h 有多種可能的值,h 指數 是其中最大的那個。
請你設計並實現對數時間複雜度的算法解決此問題。
---
O(n)解法 :
由於已經按照大小排序, 則可遍歷citations[i], 若citations[i]的值大於等於n-i的值, 則答案為n-i。
EX: citations = {0,1,2,3,4,5,6,7,8,9,10,11}, 則大於等於7的論文篇數為5, 大於等於6的為6, 大於等於5的為7。
if(citations[i]≥n-i) return n-i;
判斷式citations[i]≥n-i代表的確有足夠篇數滿足而數量為n-i, 於是回傳滿足的篇數(最大值為citations[i])。
```
class Solution {
public:
int hIndex(vector<int>& citations) {
int n=citations.size();
if(n){
for(int i=0;i<n;i++){
if(citations[i]>=n-i)return n-i;
}
return 0;
}
return 0;
}
};
```
---
O(logn)解法 - 二元搜尋
與上面相似, 目的皆為找到citations[i]≥n-i, 只是搜尋方式不同。
```
class Solution {
public:
int hIndex(vector<int>& citations) {
int n=citations.size();
if(n){
int low=0, high=n-1, ans=0;
while(low<=high){
int mid = low + (high-low)/2;
if(citations[mid]>=n-mid){
ans=n-mid;
high=mid-1;
}
else{
low=mid+1;
}
}
return ans;
}
return 0;
}
};
```