zoukankan      html  css  js  c++  java
  • 单调栈

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

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

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

      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 }

       运行结果:

  • 相关阅读:
    用原生PHP做Blog系统-Day01
    PHP做猜数字游戏
    关于html头部引用(meta,link)
    gulp基本入门
    前端构建工具gulpjs的使用介绍及技巧
    $.ajax()方法详解 jquery中的ajax方法
    js string 转 int 注意的问题——parseInt
    经常玩电脑怎么防辐射
    js 禁止重复提交
    jquery 监听回车提交
  • 原文地址:https://www.cnblogs.com/wangshi2019/p/10666773.html
Copyright © 2011-2022 走看看