H-Index

H-Index_第1张图片

题意:现在给你n篇论文,然后告诉你每篇论文的引用次数,求一个最大的整数h,使得有h篇论文的引用次数至少为h次,且剩下的n-h篇论文的引用次       数不超过h次。

      从题意中可知道0<=h<=n,考虑边界情况,h=0:没有论文或者所有论文的引用次数都是0次;h=n:有n篇论文,且每篇论文的引用次数都至少为n次。理解清楚边界情况后,中间的其实也就知道了。

     首先还是考虑暴力方法,即h从n→1枚举,然后统计引用数>=h的论文数cnt,若cnt==h,则找到。时间复杂度O(n^2),显然不行。

     接下来考虑下先排序,此处我用的堆排序,时间复杂度O(nlogn)。排序后就会发现,题目变得异常的简单,因为有序,所以只要满足citations[n-h]>=h&&citations[n-h-1]<=h则是所求解。寻找h的时间复杂度为O(n),所以总的复杂度还是O(nlogn),可行!


class Solution {
public:
    int hIndex(vector& citations) {
        int n=citations.size();
        if(n==0)
            return 0;
        Sort(citations,n);
        int h;
        for(h=n;h>0;h--)
        {
            if(citations[0]>=h&&h==n||
               citations[n-h]>=h&&citations[n-h-1]<=h)
                break;
        }
        return h;
    }
    //堆排序
    void Sort(vector& citations,int n)
    {
        for(int i=n/2;i;i--)
            Adjust(citations,i,n);
        for(int i=n-1;i;i--)
        {
            swap(citations[0],citations[i]);
            Adjust(citations,1,i);
        }
    }
    //调整节点
    void Adjust(vector& citations,int i,int n){
        int lchild=i<<1,rchild=lchild+1;
        int max=i;
        if(lchild<=n&&citations[max-1]


你可能感兴趣的:(LeetCode,OJ)