这题简单点就先对数据进行基于比较的排序,时间复杂度O(nlogn),空间复杂度O(1);如果想把时间复杂度将为O(n),就使用基数排序,但空间复杂度上升为O(n)。
class Solution {
public:
int hIndex(vector<int> &citations)
{
int n = citations.size();
int *num = new int[n+1];
memset(num, 0, (n+1)*sizeof(int));
for(int i = 0; i < n; ++i)
{
if(citations[i] >= n)
{
++num[n];
}
else
{
++num[citations[i]];
}
}
if(num[n] >= n) return n;
for(int i = n-1; i >= 0; --i)
{
num[i] += num[i+1];
if(num[i] >= i)
{
return i;
}
}
return 0;
}
};
hIndex的最大值是总文章数,所以某篇文章的引用数大于总文章数,就令总文章数对应的计数器加1,否则令引用数对应的计数器加1。若总文章数对应的计数值大于等于总文章数,说明引用数超过总文章数的文章数量等于总文章数,为最大值,返回总文章数即可。否则,倒序迭代计算引用数超过i的文章数量,若这个数量大于等于i,说明有i篇文章的引用数不少于i,符合hIndex的定义,又由于是倒序迭代,第一个返回的必然是符合条件的值中最大的,符合题目要求。
这题由于hIndex的定义是“h篇文章引用数不小于h”,而不是“引用数为h的文章数不少于h”,导致要在计数排序后再做一些处理。我们不是对于每个文章数h,去计算引用数不小于h的文章数,而是对于每个引用数h,先计算出引用数不少于h的文章数,再判断这个数是否不小于h。这么说好像有点绕,不知道说清楚了没有~