栈和排序

栈和排序

https://ac.nowcoder.com/acm/problem/14893

这道题开的时候家里比较吵闹,脑袋也不太清醒,犯了很多错误。
对贪心的理解还是不够深刻。
(灵感来自洛谷的一道栈的模板题)
错误想法
朴素的做法是用一个栈,栈空则把数字压入,和下一个数比,如果栈顶的数字大,则弹出,否则压入。显然这是错误的 例如:
5
3 1 4 2 5
后来想到第一个出来的必然是n,然后家里来人了(吵了两天),思路就断了。
正常往下,那下一个输出的就应该是n位置的前一个数到结尾中最大的数,这就不得不提到置顶题解的巧妙构思。 每次用栈顶元素和后续的最大值比较,比到n+1(即0)元素已全部入栈,逐个输出即可。
#include <bits/stdc++.h>

using namespace std;
const int N = 1e6 + 5;
int a[N];
int maxe[N];
stack<int> s;
int main()
{
int n, v = n, j;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = n; i > 0; i--)
maxe[i] = max(a[i], maxe[i + 1]);
maxe[n + 1] = 0;
for (int i = 1; i <= n; i++)
{
s.push(a[i]);
while ((!s.empty()) && s.top() > maxe[i + 1])
{
cout << s.top() << " ";
s.pop();
}
}
cout << endl;
return 0;
}</int>

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务