作者: 迷茫的启明星
学习路线 C语言从0到1 C++初阶 数据结构从0到1 欢迎关注:点赞收藏✍️留言
码字不易,你的点赞收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!
持续更新中~
在另一篇博客里讲过二分法的模板:
《二分法的模板讲解》
给定一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数。数组已按照升序排列。要求计算并返回该研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 n
篇论文中,总共有 h
篇论文分别被引用了至少 h
次。
要求设计并实现对数时间复杂度的算法解决此问题。
示例 1:
输入:citations = [0,1,3,5,6]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3 。
本题要求求解 h 指数,可以使用二分查找算法。首先,我们需要找到一个合适的中间点 mid
。然后,我们判断 citations[mid]
是否满足 citations[mid] >= citations.size() - mid
。如果满足,说明在 mid
左侧可能有更多的论文满足 h 指数的定义,因此将 l
设置为 mid
;否则,将 r
设置为 mid
。
二分查找的复杂度为 O(log n),因此整个算法的复杂度也是 O(log n)。
以下是基于二分查找的解决方案,时间复杂度为 O(log n)。
class Solution {
public:
int hIndex(vector& citations) {
int l=-1,r=citations.size();
int mid;
while(r-l>1)
{
mid=(r+l)>>1;
if(citations[mid]>=(citations.size()-mid))
r=mid;
else
l=mid;
}
return citations.size()-r;
}
};
本文描述了一种基于二分查找的解决方案,用于求解给定整数数组 citations
的 h 指数。这种解决方案的时间复杂度为 O(log n),能够有效地解决问题。