zoukankan      html  css  js  c++  java
  • 006. 柱状图最大的矩形

    ---------------------

      - 涉及内容:
      - 单调栈
    
      - 2020/10/25
    

    题目如下:


    给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

    求在该柱状图中,能够勾勒出来的矩形的最大面积。

    以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

    图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

    示例:

    输入: [2,1,5,6,2,3]
    输出: 10

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    补充知识点:

    
    - 单调栈
          单调递增栈就是从栈底到栈顶是从大到小
          单调递减栈就是从栈底到栈顶是从小到大
    
    
    

    实现:

    
    - 解法①:单调栈,以上面的图来分析过程,从最左边柱子开始,先入栈,遇到的柱子比它矮,则说明找到了右边界,
            此时需要做的时候,出栈,并且计算这个柱子的面积了,接着矮柱子入栈。接下来的两个柱子都比它高,入栈。
            当下一根柱子A要入栈的时候,比上一根柱子矮,则说明找到了上一根柱子的右边界,此时将其出栈并且可以计
            算该柱子的面积,然后柱子A继续和之前的柱子比较,发现上上根柱子也比它高,又找到了一个边界,将上上根
            柱子出栈,并计算它到要入栈之间的面积。依次类推
             
    -------------------------------------------------------------------------------------------------------------
    
    -      部分说明:
    -      能力有限,直接代入演算更加容易理解
    
    -      时间复杂度:O(N)
    -      空间复杂度:O(N)
    
    -----------------------------------------------------------------------------------
    C++
    
    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            int maxArea = 0;
            stack<int> newStack;
            heights.push_back(0);
    
            for (int i = 0; i < heights.size(); ++i) {
                // 如果栈不空并且如果要入栈的元素比栈内元素要小的话,则将栈内元素出栈,并计算面积
                while (!newStack.empty() && heights[newStack.top()] >= heights[i]) {
                    int cur = newStack.top(); 
                    newStack.pop();      //  出栈
    
                    maxArea = max(maxArea, heights[cur] * (newStack.empty() ? i : (i - newStack.top() - 1)));   //   L1
                }
                newStack.push(i);      // 入栈的是数组下标索引
            }
            return maxArea;
        }
    };
    
    ------------------------------------------------------------------------------------------------------------
    
    入栈是递增方式,即左边界就是当前柱子的上一根柱子或者它本身就是第一根柱子,主要是寻找右边界
    
    while循环流程演算,L1 部分结合图形
          以(i - newStack.top() - 1)) ,当 元素3要入栈时为例
          当value= 3 时,进入while循环
          此时maxArea计算的是value = 3 之前比它高的柱子的矩形面积
          如:maxArea = 6 * ( 4 - 2 - 1 ) = 6 , 
          接着while
          maxArea = 5 * ( 4 - 1 - 1 ) = 10 ,
    
          以newStack.empty() = true 为例
          当value = 1 时,进入while
          此时,newStack中唯一的元素出栈
          maxArea = 2 * 1
    
    ------------------------------------------------------------------------------------------------------------
    
    
    
  • 相关阅读:
    三角函数
    第十七次作业
    第十六次作业
    第15次作业
    第13次java作业
    第十二次java作业
    第十一次java作业
    第十次java作业
    第九次java
    第八次java作业
  • 原文地址:https://www.cnblogs.com/cstrick-1/p/13873950.html
Copyright © 2011-2022 走看看