思路
其实就是找一个数组的h,h的定义是:h个大于等于h的元素,h越大越好
将数组从大到小排序,只需要判断index+1和citations[index]的值
index+1 代表的是目前有多少个元素,对于下面的例子
citations = [3,0,6,1,5]
排序后citations = [6,5,3,1,0]
从前往后找
citations[0]为6,同时表明大于等于6的文章只有index+1=1篇(因为逆排序过了),这是不符合要求的(如果h=6,应该至少有六篇文章,且每篇文章引用量大于等于6),而且目前是h找大了,应该往小找,所以index++,
citations[1]为5.也不满足条件,因为引用大于等于5的只有index+1=2篇
citations[2] =3 满足条件,
这个时候还需要继续(为什么需要继续,考虑例子:100,99,98,97 正确答案应该是4,所以index应该尽量大)
citations[3] =1,
但是因为citations[index] < index+1;
即4篇文章,但是不是4篇引用量都大于4
对于例子100,99,98,97,有4篇文章引用量都大于4
这个感觉可以用二分查找,但是边界不会处理,下面是我的笨代码:
代码
public static int hIndex(int[] citations) {
List<Integer> citationList = new ArrayList<>(IntStream.of(citations)
.boxed()
.toList());
citationList.sort(Comparator.reverseOrder());
for (int i =0;i<citationList.size();i++){
if (citationList.get(i)<i+1){
return i;
}
}
return citationList.size();
}
看了别的题解,可以不排序
https://leetcode.cn/problems/h-index/solutions/869042/h-zhi-shu-by-leetcode-solution-fnhl/?envType=study-plan-v2&envId=top-interview-150
时间复杂度O(n)
空间复杂度O(n)