【发布时间】:2013-06-29 06:26:36
【问题描述】:
我最近在某个地方遇到了一个非常好的面试问题,我想问你们所有的天才,什么是最优化的解决方案。所以问题如下: 给定一个整数数组,找到一个最大数 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
【问题讨论】:
-
“O(N) 解”中的 N 指的是什么?另外,是否给出了整数大小或数组大小的上限?
-
N 是数组中给定的元素个数。
-
如果数组未排序,那么你不会比 O(N) 做得更好
-
好的。所以下一个问题是如果数组是排序的。 ?
-
我想我没有把问题说清楚,我刚刚编辑过,你能检查一下吗?
标签: arrays algorithm data-structures big-o