单调栈
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 }
运行结果:
以上是关于单调栈的主要内容,如果未能解决你的问题,请参考以下文章