高效算法:给定未排序的正整数数组和整数N,如果数组中存在N或第一个数字则返回N

时间:2009-09-28 16:56:09

标签: algorithm

我有这个问题:

  

给定未排序的正整数数组和整数N,如果数组中存在N或第一个小于N的数字,则返回N.

在一次采访中想知道什么是解决它的最有效算法?

我使用散列和排序数组给出了两种方法,但这不是正确有效的方法。如果有人能为这个问题提供最佳算法,我将非常感激。

3 个答案:

答案 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;
}