我最近在某个地方遇到了一个非常好的面试问题,我想问你们所有的天才,什么是最优化的解决方案。所以问题如下:给定一个整数数组,找到一个最大数n,使得至少有n个数组元素大于n。输入数组未排序。
例如:
输入:1,2,5,7,8,10 输出:n = 4
输入:0,2,7,8,19,5,45,9,23 输出:n = 6
我能想到的一种解决方案(如果数组是排序的情况)是顺序扫描数组中的所有元素以找出 min:n 和 max:n。然后在 min:n 到 max:n 之间递增整数并一一检查。但这是 O(N) 解决方案。有人可以推荐一个更好的吗?
例如:对于输入 1 min:n = 2 和 max:n = 5
那么您将检查数字 2,3 和 4 作为答案。
从答案来看,如果数组未排序,则没有比 O(N) 更好的解决方案。但是下一个问题是如果给定的数组是排序的呢?
pseudocode :
// this assumes sorted input.
pubic int findhighestIndex(List<Integer> input){
it min=0,max=0,n=0,maxIndex=0;
for(int i=0;i<input.size();i++){
if( input.get(i)>(input.size()-i) ){
max=input.get(i);
maxIndex=i;
min=input.get(i-1);
break;
}
else if(input.get(i)<(input.size()-i)){
max=min=input.get(i);
}
}
int i=max;
while( i>=min && (input.size()-maxIndex)<i ){
i--;
}
System.out.println(i);
}
更新:这个问题也称为查找 h-index