题目来源
题目描述
题目解析
理解题意
H指数的定义:
- N 篇论文中总共有 h 篇论文分别被引用了至少 h 次;
- 其余的 N - h 篇论文每篇被引用次数不超过 h 次。
H指数表示:一个人的论文根据被引用的次数,有一个阈值(分水岭,就是这里的 h),引用次数大于等于这个阈值的论文是高引用论文
所以理解 h 指数的时候可以把一个研究者的论文被引用的次数 按照升序排序。题目其实要我们找的是一条分割线,这条分割线的含义是:分割线右边的所有论文的引用次数都很高,并且:分割线右边的最少引用次数 >= 分割线右边的论文篇数。
注意:h 指数是论文数量,不是引用次数。
结论:这条分割线越靠左边,说明被引用的次数很多,文章还很多,h 指数越高。
理解题意
h篇论文的被引用次数大于h,你把每篇论文的被引用次数这个数组想象成一个矩形图,这里就是让你找这个矩形图右侧最大正方形,最后的返回值就是这个正方形的边长
一次遍历
H指数定义为一个人的学术文章有n篇分别被引用了n次,那么H指数就是n
wiki上直接给出了算法:
- 将其发表的所有SCI论文按被引次数从高到低排序;
- 从前往后查找排序后的列表,直到某篇论文的序号大于该论文被引次数。所得序号减一即为H指数。
class Solution {
public:
int hIndex(vector<int>& citations) {
sort(citations.begin(), citations.end(), greater<int>());
for (int i = 0; i < citations.size(); ++i) {
if (i >= citations[i]) return i;
}
return citations.size();
}
};
思路
class Solution {
public:
int hIndex(vector<int>& citations) {
sort(citations.begin(), citations.end());
int h = 0, i = citations.size() - 1;
while (i >= 0 && citations[i] > h) {
h++;
i--;
}
return h;
}
};
275. 二分查找
class Solution {
public:
int hIndex(vector<int>& citations) {
int n = citations.size();
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (citations[mid] >= n - mid) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return n - left;
}
};