题目
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数
输入: citations = [0,1,3,5,6]
输出: 3
题解
第一种
我们这里采用二分的方式进行实现,首先在函数中定义了变量length,用于保存citations数组的长度,然后我们接下来去计算mid的值,通过将length除以2并向下取整得到,这个值用于表示二分查找的中间位置,然后根据citations数组的长度的奇偶性来确定H指数的初始值h,如果数组长度是偶数,将mid赋值给h,如果数组长度是奇数,将mid+1赋值给h,我们在使用while循环进行二分查找,循环的条件是citations[mid]小于h并且mid小于length,在循环中我们将mid和h都向后移动一位,表示向右偏移,然后我们再次比较citations[mid]和h的值,如果citations[mid]仍然小于h,则继续向后移动mid和h,直到找到满足条件的位置或者超出了数组的范围,然后我们使用另一个while循环进行修正,循环的条件是citations[mid - 1]大于h并且mid大于等于0,在循环中我们将mid和h都向前移动一位,表示向左偏移,我们再次比较citations[mid - 1]和h的值,如果citations[mid - 1]仍然大于h,则继续向前移动mid和h,直到找到满足条件的位置或者超出了数组的范围,当循环结束后,我们将h返回出去即可
var hIndex = function(citations) {
let length = citations.length;
let mid = Math.floor(length / 2);
let h = length % 2 === 0?mid:mid+1;
while(citations[mid] < h && mid < length){
mid++;
h--;
}
while(citations[mid - 1] > h && mid >= 0){
mid--;
h++;
}
return h;
};
第二种
我们在函数中先声明一个len常量,他是参数citations的长度,代表这论文数量,然后我们在声明一个变量h,并将其初始化为len,这个变量h表示当前的H指数,初始值为论文数量,然后我们使用一个循环去遍历数组citations中的每个元素,循环的条件我们设定为i<len,其中i是循环变量,初始值为0,在循环中,我们检查当前论文的引用次数是否大于等于h,如果满足条件则说明当前论文是H指数的一部分,因为它至少被引用了h次,然后我们直接将h变量返回出去即可
var hIndex = function(citations) {
const len = citations.length;
let h=len;
for(let i=0;i<len;i++){
if(citations[i]>=h){
return h
}
h--;
}
return h
};
坚持努力,无惧未来!