我有这个问题:
给定未排序的正整数数组和整数N,如果数组中存在N或第一个小于N的数字,则返回N.
在一次采访中想知道什么是解决它的最有效算法?
我使用散列和排序数组给出了两种方法,但这不是正确有效的方法。如果有人能为这个问题提供最佳算法,我将非常感激。
答案 0 :(得分:16)
我假设这是一种C风格的语言;如果没有,请更新问题以反映语言。
如果数组没有排序,那么你别无选择,只能对数组进行(可能)完全遍历以查找N
,因为任何排序操作所花费的时间都比简单遍历数组要长(其他而不是通过“盲目运气”找到元素。类似于此的东西可能是最有效的(除非我遗漏了一些东西)
int retVal = -1;
for(int i = 0; i < ARRAY_LENGTH; i++)
{
if(array[i] == N) return N;
if(retVal == -1 && array[i] < N) retVal = array[i];
}
return retVal;
正如其他地方所建议的,您可以修改
if(retVal == -1 && array[i] < N) retVal = array[i];
到
if(retVal < array[i] && array[i] < N) retVal = array[i];
为了获得小于N
的最大值,而不是简单的第一个。
答案 1 :(得分:13)
从头到尾扫描列表,如果您看到的值小于N,请抓住第一个值直到结束,或者找到N.如果找到N,请返回,如果到达最后,返回你所持有的价值。据推测,如果所有值都大于N,则必须返回一些值,但问题并未说明。
O(N)性能,O(1)空间使用。
如果你正在寻找小于N的最大值,这有点棘手。在这种情况下,你不必坚持小于N的第一个值,而是每次找到小于N的值时,只需抓取一个新值。 N,但大于您目前持有的值。
简单地替换
if(array[i] < N && retVal == -1) retVal = array[i];
与
if(array[i] < N && retVal < array[i]) retVal = array[i];
Adam's answer 中的
答案 2 :(得分:0)
这是我的代码:
int getNindex(int a[],int n,int N)
{
int min=-99999,i=0,minindex=-1;
for(i=0;i<n;i++)
{
if(a[i]>min && a[i]<=N)
{
min=a[i];
minindex=i;
}
}
return minindex;
}
int main()
{
int a[]={5,75,20,50,100};
int Nindex=getNindex(a,5,60);
if(Nindex>=0)
printf("index= %d,N= %d\n",Nindex,a[Nindex]);
return 0;
}