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

Algorithm 高效算法:给定一个未排序的正整数数组和一个整数N,如果数组或第一个数字中存在N,则返回N<;N,algorithm,Algorithm,我有一个问题: 给定一个未排序的正整数数组和一个整数N,如果数组中存在N或第一个小于N的数字,则返回N 在一次采访中,他想知道解决这个问题的最佳有效算法是什么 我给出了两种使用哈希和排序数组的方法,但这不是正确和有效的方法。如果有人能给出这个问题的最佳算法,我将不胜感激 我假设这是一种C风格的语言;如果没有,请更新问题以反映语言 如果未对数组进行排序,则除了(可能)完全遍历数组以查找N,您别无选择,因为任何排序操作都将花费比简单遍历数组更长的时间(而不是通过“盲目运气”查找元素)。类似这样的东西

我有一个问题:

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

在一次采访中,他想知道解决这个问题的最佳有效算法是什么


我给出了两种使用哈希和排序数组的方法,但这不是正确和有效的方法。如果有人能给出这个问题的最佳算法,我将不胜感激

我假设这是一种C风格的语言;如果没有,请更新问题以反映语言

如果未对数组进行排序,则除了(可能)完全遍历数组以查找
N
,您别无选择,因为任何排序操作都将花费比简单遍历数组更长的时间(而不是通过“盲目运气”查找元素)。类似这样的东西可能是最有效的(除非我遗漏了什么)

int-retVal=-1;
for(int i=0;i
正如其他地方所建议的,您可以修改

if(retVal == -1 && array[i] < N) retVal = array[i];
if(retVal==-1&&array[i]

if(retVal

为了获得小于
N
的最大值,而不仅仅是第一个值。

从头到尾扫描列表,如果看到小于N的值,请按住第一个值,直到到达末尾,或者找到N。如果找到N,则返回它;如果到达末尾,则返回所保留的值。如果所有的值都大于N,那么可能必须返回一些值,但问题并没有说明这一点

O(N)性能,O(1)空间使用

如果要查找小于N的最大值,则会有一点困难。在这种情况下,您不必保留第一个小于N的值,而只要在每次找到小于N但大于当前保留值的值时获取一个新值即可

简单地替换

if(array[i] < N && retVal == -1) retVal = array[i];
if(array[i]

if(array[i]
以下是我的代码:

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;
}
intgetnindex(inta[],intn,intn)
{
int min=-99999,i=0,minindex=-1;
对于(i=0;imin&&a[i]=0)
printf(“索引=%d,N=%d\N”,Nindex,a[Nindex]);
返回0;
}

他们想要的第一个数字是:数组中小于N的第一个数字,还是小于N时最接近N的数字?@JB King:小于N的第一个数字。此外,如果有人能详细说明解决此类问题的总体策略,那就太好了。参考书籍或在线资料也会有帮助。数组的排序为O(nlogn),而如果通过保持指向N的指针和之前的指针进行线性搜索,则为O(N)。消除歧义:“第一个小于N的数字”、数组中的第一个数字或最接近的小于N的整数“第一个小于N的数字“你认为这是数组中的第一个数字吗?@Eclipse:如果我们寻找的是最接近N的数字,而不是第一个小于N的数字,那该怎么办呢?奇数的,被接受的答案直接引用了我的实际代码。@Adam,是的,我对你的答案投了更高的票,因为我们基本上在同一时间找到了相同的答案,你只是提供了一个示例代码,这让我大吃一惊。不知道为什么我的被接受而不是你的。@Eclipse,我的也早了一分钟多在最后一次比较中,首先检查retVal==-1不是更好吗?一旦它被设置好,你就不必再去寻找N本身以外的任何东西了。如果你真的不想做不必要的比较,你可以把它分成两个循环。第一个与您现在拥有的类似,但是当您发现一个小于N的元素时,它会停止。第二个在第一个元素停止的位置启动,并且只有
if(array[i]==N)返回N零件。
if(array[i] < N && retVal == -1) retVal = array[i];
if(array[i] < N && retVal < array[i]) retVal = array[i];
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;
}