一:超时代码,时间复杂度为O(n*n)
```cpp
#include<bits/stdc++.h>
using namespace std;
#define base 2333
int A[1000005];
int main()
{
int n;
int j;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
for(int i=0;i<n;i++)
{
for( j=i+1;j<n;j++)
if(A[j]>A[i])
{
printf("%d ",j+1);
break;
}
if(j==n)
printf("0 ");
}
return 0;
}
``
二:正确代码如下,从右往左扫描,维护了一个从栈底到栈顶单调减少的栈
#include<bits/stdc++.h>
using namespace std;
int A[1000005];
int B[1000005];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
stack<int>s;
for(int i=n-1;i>=0;i--)
{
if(s.empty())
{
B[i]=0;
s.push(i);
}
else
{
while(!s.empty()&&A[s.top()]<=A[i])
s.pop();
if(s.empty())
{
B[i]=0;
s.push(i);
}
else
{
B[i]=s.top()+1;
s.push(i);
}
}
}
for(int i=0;i<n;i++)
printf("%d ",B[i]);
return 0;
}