LeetCode——H-Index

本文深入探讨了基于比较的排序算法及其O(nlogn)的时间复杂度与O(1)的空间复杂度,同时引入了基数排序,将时间复杂度降至O(n),但空间复杂度提升至O(n)。通过实例分析,详细阐述了如何利用计数排序来解决hIndex问题,以及在hIndex定义下,如何准确计算最大hIndex值。本文还特别强调了在计数排序后需要进行的额外处理,以适应hIndex特定的计算逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题简单点就先对数据进行基于比较的排序,时间复杂度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。这么说好像有点绕,不知道说清楚了没有~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值