题解 | #栈和排序#
栈和排序
https://ac.nowcoder.com/acm/problem/14893
思路:
- 在a数组中,如果a[i]后面没有比它还大的数,那就直接把这个数输出,否则这个位置输出的数就会比a[i]小,那么字典序就会更小。
- 用一个数组maxn来记录每个数后面的最大值,从后往前循环,求出a[i]到a[n]的最大值
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N],maxn[N];
int main(){
int n;
cin>>n;
stack<int> s;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>=1;i--) maxn[i]=max(maxn[i+1],a[i]);//maxn表示a[i]到a[n]中的最大值
for(int i=1;i<=n;i++)
{
s.push(a[i]);
while(!s.empty() && s.top()>maxn[i+1])//如果后面没有比栈顶大的数,就输出
{
printf("%d ",s.top());
s.pop();
}
}
while(!s.empty())
{
printf("%d ",s.top());
s.pop();
}
return 0;
}