我需要从实际索引中计算左侧和右侧数组中的最大数字。我的意思是如果我的数组是

1, 3, 2, 4, 3;

我需要输出:
//Left Right
1 4 //no bigger on left, so 1; the biggest on right is 4
3 4 //and so on with rest points
3 4
4 4
4 3

我需要非常快地做到这一点,所以只在左边然后在右边是一个坏主意。我决定在右边找到最大的,然后当我到达那里时数下一个,依此类推。最大在左边,如果实际大于它,改变它。但是有些东西不起作用......该程序有时会给出错误的输出。不幸的是,我不知道它的输入是什么......

这是我的代码,如果您可以看到任何一般或算法错误,我很高兴您可以发布它...
#include <cstdlib>
#include <iostream>

using namespace std;

inline int findmax(int tab[], int beg, int end)
{
    int max=0;
    for (int j=beg; j<end; j++)
        if (tab[j]>max) max=j;
    return max;
}

int main(int argc, char *argv[])
{

    int len;
    cin>>len;

    int h[len];
    for (int i=0; i<len; i++)
    cin>>h[i];

    int maxl=0, maxr;

    maxr=findmax(h,0,len);

    for (int i=0; i<len; i++)
    {
        if (h[i]>h[maxl]) maxl=i;
        if (i>maxr) maxr=findmax(h,i,len);
        cout<<h[maxl]<<" "<<h[maxr]<<endl;
    }
    //system("pause");
    return 0;
}

编辑:
我已经阅读了所有回复并实现了它。一个问题是我无法在第一个循环中存储值,所以我必须“合并”两个 for ......这是我现在的代码:
#include <cstdlib>
#include <iostream>

using namespace std;

inline int findmax(int tab[], int beg, int end)
{
    int max=0;
    for (int j=beg; j<end; j++)
        if (tab[j]>max) max=j;
    return max;
}

int main(int argc, char *argv[])
{

    int len;
    cin>>len;

    int h[len];
    int l[len];
    for (int i=0; i<len; i++)
    cin>>h[i];

    int maxl=0, maxr;

    maxr=len-1;

    for (int i=len-1; i>=0; i--)
    {
        if (h[i]>h[maxr]) maxr=i;
        l[i]=h[maxr];
    }

    for (int i=0; i<len; i++)
    {
        if (h[i]>h[maxl]) maxl=i;
        cout<<h[maxl]<<" "<<l[i]<<endl;
    }
    //system("pause");
    return 0;
}

最佳答案

由于嵌套循环,您的程序的时间复杂度为 O(n^2)。但这可以在线性时间内完成:

您已经知道如何找到每个元素左侧的最大元素:迭代所有元素,跟踪当前的最大值。每个元素左侧的最大元素是您到达该元素时的当前最大值。

要找到每个元素右侧的最大元素,您可以反过来做同样的事情:从右到左迭代数组,跟踪当前的最大值。

因此,您将有两个循环(从左到右和从右到左),但它们不会相互嵌套,因此大型数组的性能会好得多。

关于C++ 搜索数组中最大的数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9502484/

10-15 06:53