处理算法难题。发布问题陈述和代码。我的问题是,对于最后一行,返回引用[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);
}
};
提前谢谢,
林
答案 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循环的退出条件以及left
和right
之间的差异只能由1
改变的事实最大,每次迭代。
总体而言,最佳解决方案是首先排序输入,然后执行二进制搜索,同时为您提供O(N log N)
时间复杂度。
它不会比这更好。
Sidenote :我会避免像>>1
这样的代码而不是简单地除以2
,因为这会损害可读性,而没有任何好处。我假设您使用的是合理的编译器(具有优化功能)。