Мне нужно посчитать наибольшее число в массиве слева и справа от фактического индекса. Я имею в виду, если мой массив
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;
}
EDIT:
Я прочитал все ответы и реализовал это. Одна проблема заключается в том, что я не могу сохранить значения в первом цикле, поэтому я должен «объединить» два 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;
}