相对于第一题,这里提供的输入数组时已经排序的。
解题思路:最简单的做法就是遍历,依次判断每一个位置的元素是否符合H-index 的定义,而且题目中给出了当出现多个值得时候,选取最大的。比如输入为【0,1,2,5,6】
根据定义是至多h篇文章至少被引用h次。所以这里出现2,5其实都是符合条件的,这时候我们选取5,这样返回值就是2.又假设输入时【1,0,1,1,2,1】这里1,2都是符合条件的,我们选取2,返回值为1.
代码如下:
int hIndex1(vector<int>& citations) {
int res=0;
int size=citations.size();
for(int i=0;i<size;++i){
if(citations[i]>=size-i){
res=size-i;
break;
}
}
return res;
}
上一种的实现是遍历查找,根据题意,其实就是需要查找到第一个其值大于等于剩余元素个数的位置,既然是查找,很自然就会想到二分查找,实现如下:
//binary search;
int hIndex(vector<int>& citations){
int min=0,size=citations.size();
int max=size-1;
while(min<=max){
int mid=min+(max-min)/2;
if(citations[mid]==size-mid){
return size-mid;
}else if(citations[mid]<size-mid){
min=mid+1;
}else
max=mid-1;
}
return size-(max+1);
}