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 }

       运行结果:

  • 相关阅读:
    hive调度脚步p_fact_bi_browser_t_job.sh
    public_db.cfg数据库配置公共变量设置
    public_time.cfg时间公共变量设置
    sqoop导出数据到关系数据库export_fact_bi_browser_t_job.sh
    sqoop导入数据到hdfs初始化
    审批流程
    关于触发器修改自身数据表实例
    Oracle触发器修改自身字段解决方案
    JSON.stringify(国丰PU3023)
    $("#lblMsg").html("请先选择一行网格数据!");
  • 原文地址:https://www.cnblogs.com/wangshi2019/p/10666773.html
Copyright © 2011-2022 走看看