原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述
给你一个整数数组
citations
,其中citations[i]
表示研究者的第i
篇论文被引用的次数,citations
已经按照 升序排列 。计算并返回该研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的
h
指数是指他(她)的 (n
篇论文中)总共有h
篇论文分别被引用了至少h
次。请你设计并实现对数时间复杂度的算法解决此问题。
样例1:
输入
citations = [0,1,3,5,6]
输出
3
样例2:
输入
citations = [1,2,100]
输出
2
Tag
二分
个人做法
个人用的是Acwing的二分法,特判了一下
class Solution {
public:
int hIndex(vector<int>& citations) {
int size = citations.size();
int l = 0,r = size-1;
while(l<r){
int mid = (l+r)/2;
if(citations[mid] >= size-mid ) r = mid;
else l = mid+1;
}
if(l == r && citations[l] == 0) return 0;
return size-l;
}
};
官方做法
class Solution {
public:
int hIndex(vector<int>& citations) {
int size = citations.size();
int l = 0,r = size-1;
while(l<=r){
int mid = (l+r)/2;
if( citations[mid] >= (size-mid) ) r = mid-1;
else l = mid+1;
}
return size-l;
}
};
官方思路是把左区间放到满足条件的最小值处,右区间放到不满足条件的最大值处,且跳出循环必须是 l 严格大于 r ,因为最后结果是拿 l 算的,所以当l == r时,此时的 l 仅仅是不满足条件的最大值处