• 单调栈


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

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

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

      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 }

       运行结果:

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/wangshi2019/p/10666773.html
Copyright © 2020-2023  润新知