建议的{h-index计算

时间:2015-11-16 03:53:18

标签: c++ algorithm

处理算法难题。发布问题陈述和代码。我的问题是,对于最后一行,返回引用[right]是否总是与return len - (right + 1)具有相同的结果?我尝试了几个测试用例,似乎两者都具有相同的价值。想要寻求建议的是什么样的反样品不同?感谢。

考虑到研究人员的一系列引用(每个引用是一个非负整数),写一个函数来计算研究者的h指数。

根据维基百科上h-index的定义:"如果他/她的N篇论文中至少有h引文,那么科学家就有索引h,其他N-h论文不超过h每个引用。"

例如,给定引用= [3,0,6,1,5],这意味着研究人员总共有5篇论文,并且每篇论文分别接受了3次,0次,6次,1次5次引用。由于研究人员有3篇论文,每篇论文至少引用3篇,其余两篇论文每次引用次数不超过3次,因此他的h指数为3。

如果引用数组按升序排序怎么办?你能优化你的算法吗?

class Solution {
public:
    int hIndex(vector<int>& citations) {
        int left=0, len = citations.size(), right= len-1,  mid;
        while(left<=right)
        {
            mid=(left+right)>>1;
            if(citations[mid]== (len-mid)) return citations[mid];
            else if(citations[mid] > (len-mid)) right = mid - 1;
            else left = mid + 1;
        }
        return len - (right+1);
    }
};
提前谢谢, 林

1 个答案:

答案 0 :(得分:2)

首先,您的实施无论如何都适用于已排序的输入,对吗?

现在想象输入:

vector<int> v{1,2,5,6,9};

此输入将返回不同的值:

return len - (right+1);    // returns 3 (correct answer)
return citations[right];   // returns 2 (wrong answer)

但你可以这样做:

return len-left; 

这项工作原则right+1将始终等于此行left(给定您的代码)。

考虑 while循环的退出条件以及leftright之间的差异只能由1改变的事实最大,每次迭代。

总体而言,最佳解决方案是首先排序输入,然后执行二进制搜索,同时为您提供O(N log N)时间复杂度。

它不会比这更好。

Sidenote :我会避免像>>1这样的代码而不是简单地除以2,因为这会损害可读性,而没有任何好处。我假设您使用的是合理的编译器(具有优化功能)。