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 }

       运行结果:

  • 相关阅读:
    (网页)中的简单的遮罩层
    (后端)shiro:Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
    (网页)jQuery的时间datetime控件在AngularJs中使用实例
    Maven Myeclipse 搭建项目
    MyBatis 环境搭建 (一)
    java 常用方法
    XML 基础
    JS BOM
    js 事件
    js 的使用原则
  • 原文地址:https://www.cnblogs.com/wangshi2019/p/10666773.html
Copyright © 2011-2022 走看看