• 单调栈


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

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

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

      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 }

       运行结果:

  • 相关阅读:
    Software_programming_automation_selenium
    Software_programming_EnterpriseArch_ServiceWithSingleTonFactory
    web-bootstrap-button
    Software--C#--grammer_Delegate--Event
    Software_C#_grammer_Deletegate--Strategy
    Software--BigData--StreamingData
    线程死锁和递归锁
    同步锁Lock(互斥锁)
    GIL计算python 2 和 python 3 计算密集型
    什么是python的全局解释锁(GIL)
  • 原文地址:https://www.cnblogs.com/wangshi2019/p/10666773.html
Copyright © 2020-2023  润新知