单调栈

Posted zhenglijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调栈相关的知识,希望对你有一定的参考价值。

给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。

输入格式

第一行包含整数N,表示数列长度。

第二行包含N个整数,表示整数数列。

输出格式

共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。

数据范围

1N1051≤N≤105
11091≤数列中元素≤109

输入样例:

5
3 4 2 7 5

输出样例:

-1 3 -1 2 2

 

构造单调栈

      求一个数左边比第一个比它小的数,我们就可以构造单调递增栈,如果st[tt] >= x说明栈顶元素大于新元素x,则弹栈,直到栈为空,或者栈顶元素小于新元素x,则可以构造单调递增栈,判断一下栈是否为空,若为空说明左边没有比新元素小的元素,则输出-1,否则就输出栈顶元素即可。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 100010;
 6 
 7 int n;
 8 int stk[N], tt;
 9 
10 int main()
11 {
12     cin >> n;
13 
14     for(int i = 0; i < n; i++)
15     {
16         int x;
17         cin >> x;
18         while(tt && stk[tt] >= x) tt--;
19         if(tt) cout << stk[tt] << " ";
20         else cout << -1 << " ";
21 
22         stk[++tt] = x;
23     }
24 
25     system("pause");
26     return 0;
27 }

 

以上是关于单调栈的主要内容,如果未能解决你的问题,请参考以下文章

线性表--单调栈

线性表--单调栈

LeetCode- 柱状图中最大的矩形(单调栈)

HDU 6957 Maximal submatrix(悬线法 || 优先队列 || 单调栈 )

单调队列与单调栈作用

51nod1102(单调栈/预处理)