单调栈

Posted wangshi2019

tags:

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

  单调栈是一种栈的特殊的用法。

  单调栈中包括单调增栈,单调减栈。

  以下说明单调栈的两种基本的用法:

  1.单调增栈用来求解vector中每个元素前一个比其小的元素,并且时间复杂度是O(n).

  2.单调减栈用来求解vector中每个元素下一个比其小的元素,时间复杂度同样是O(n)。

  单调增栈用来实现1的代码如下:

 技术图片

  单调减栈用来实现2的代码如下:

技术图片

 以leetcode上84题具体分析:

技术图片

  本题使用到单调增栈进行求解,在遇到比栈顶元素小的元素时,将栈中的元素进行pop,并且计算每一个height下的面积,进行比较得到最大值,具体实现代码如下:

  

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 int largestRectangleArea(vector<int>& heights) 
 6 {
 7     //使用单调增栈进行求解
 8     //栈中存放的是下标而不是值
 9     //需要在后面加上个0,保证最后一个数能参与运算
10     vector<int>result;
11     heights.push_back(0);
12     //用来保存最大的面积
13     int sum = 0;
14     for (int i = 0; i < heights.size(); i++)
15     {
16         while (!result.empty()&&heights[result.back()]>=heights[i])
17         {
18             //高度
19             int h = heights[result.back()];
20             //提取栈顶元素并且计算当前的矩形的面积
21             result.pop_back();
22             int sidex = result.size() > 0 ? result.back() : -1;
23             //计算面积
24             sum = max(sum, h*(i - sidex - 1));
25         }
26         result.push_back(i);
27     }
28     return sum;
29 }
30 
31 int main()
32 {
33     vector<int>heights = { 2,1,5,6,2,3 };
34     int t=largestRectangleArea(heights);
35     cout << t << endl;
36     return 0;
37 }

 

   运行结果:

技术图片

 

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

线性表--单调栈

线性表--单调栈

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

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

单调队列与单调栈作用

51nod1102(单调栈/预处理)