H-index I && II

ss
3 min readFeb 3, 2021

--

這是評論一個人的論文水準, 假設他總共發五篇

[3,0,6,1,5]

他有三篇以上的論文獲得三個以上的citation, 他的h-index就是3

我們先排序, 然後從後面依序看回來,

[0,1,3,5,6]

先看6, 這時的h-index是1

5 h-index:2

3 h-index:3

1 因為1的citation太少, 所以就不會再增加h-index直了

class Solution {
public:
int hIndex(vector<int>& citations) {
sort(citations.begin(), citations.end());
int res = 0;
int j = 1;
for(int i = citations.size() - 1; i>=0;i--,j++){
if(citations[i] >=j){
res = max(res, j);
}
}
return res;
}
};

但這要排序 時間複雜度是O(nlogn)

另外一個做法只要O(n)

首先, 我們給出n+1個桶子, index分別是1~n

接著, 假設大於n 我們就放到第n個, 其餘就按各自的index放

最後, 我們從最後一個桶子看, 假設第n個桶子(最優質的論文), 引用次數大於了n, 我們就往前看, 反正保底已經是這幾張優質論文會是我的h-index, 若找到剛好, 若count數剛好等於index, 直接輸出, 因為接下來的index不可能高過count了(index只會越來越小)

class Solution {
public:
int hIndex(vector<int>& citations) {
int res;
int n = citations.size();
vector<int> buckets( n+1, 0);
for(auto &b: citations){
if(b>n){
buckets[n]++;
}else{
buckets[b]++;
}
}
int count = 0;
for(int i = n; i >= 0; i--) {
count += buckets[i];
if(count >= i) {
return i;
}
}
return 0;
}
};

因為他說O(logn)了, 基本上就是二分搜尋

不過要注意index的使用方式,

假設當長度大於當前cts的值, 表明說, 你設這個值當index恐怕太低, 可以往上增加試看看

class Solution {
public:
int hIndex(vector<int>& cts) {

int len = cts.size(), l = 0, r = len - 1;
while (l <= r) {
int mid = (l + r) /2;
if(cts[mid] == len - mid){
return len - mid;
}else if(cts[mid] < len-mid){
l = mid + 1;
}else{
r = mid - 1;
}
}
return len - l;
}
};

--

--

ss
ss

No responses yet