Leetcode 热题100 84.柱状图中最大矩形(C++)

1、题目

Leetcode 热题100 84.柱状图中最大矩形(C++)_第1张图片

Leetcode 热题100 84.柱状图中最大矩形(C++)_第2张图片 

这是一道与栈、数组相关联的一道题,是应用栈很经典的一道题目,它的解题思路与我之前发布的——Leetcode 题解的 接雨水(大厂的常考题),有异曲同工之妙 !接下来让我们来详细进入这道题的解析!

2、解题集

2.1、暴力解法

首先,对于暴力解法,最终的结果一定是超时的,时间复杂度是O(n*n),但是很多时候,暴力解法都是我们做题的第一步,很多时候正解也是从暴力解法一步一步优化而来的。好啦,我们回归题目

我们根据题意,我们对所求矩形的”高“经行枚举:即从所给的数组元素中的某个元素开始,从该元素位置,向左寻找,第一个值小于该元素值的元素的下标位置left;再从该元素位置,向右寻找,第一个值小于该元素值的元素的下标位置right;那么ans=(right-left+1)就是以该元素为高对应的最大矩形的宽度,则,该元素的值乘ans就是对应的最大矩形的面积,最后依次枚举,一次比较,即可得到题目所求的最大的矩形的面积。

代码展示

class Solution{
    public:
    int largestRectangleArea(vector& heights){
        int n=heights.size();
        int ans=0;
        for(int i=0;i=0 && heights[left-1]>=height)//以该元素向左找寻,第一个小于该元素的下标
            {
                left--;
            }
            while(right+1=height)//以该元素向右找寻,第一个小于该元素的下标
            {
                right++;
            }
            int m=(right-left+1)*height;//该元素对应的宽度
            ans=max(ans,m);//比较最大值
        }
        return ans;
    }
};

2.2、单调栈

我们再暴力解法的基础上,做出进一步的优化——单调栈,我们用栈来保存每个元素的下标,我们遍历一遍原数组,如果栈空,就进栈,如果栈顶元素小于我们所遍历的元素的值时,我们记录此时栈顶元素对应的值,并出栈,然后用此时元素对应的坐标-栈顶元素-1,就是此时栈顶元素的值所对应的元素值为高所能形成的最大矩形的宽度。然后按照这个思路一直经行就行了,具体步骤如下:

1、:heights数组左右两端各加一个0形成一个新数组,这样栈永远非空且里面的非零元素都可以出栈从而计算相应高度的最大矩形面积(题目中说明了高度均大于0);

2、:从左到右遍历新数组:

①栈空或当前元素>=栈顶,则表明以栈顶元素对应高的矩形面积还不能确定,所以就将新元素入栈,维持非严格单调递增栈
②:如果栈非空且当前元素<栈顶元素对应高,表明以栈顶元素值对应高的柱子找到最近的下一个更矮的柱子,由此可以确定以栈顶元素对应高的矩形面积了。矩形高就是栈顶元素值,右边界就是当前元素,左边界是栈顶元素的前一个元素。因为在上一步中我们知道栈中元素值对应高从栈底到栈顶非严格单调递增。因此矩形宽是当前元素下标与栈顶元素前一个元素的下标的差值-1。另外,栈顶元素出栈后,需要继续看当前元素是否<新栈顶元素值,如果是,就继续pop出栈顶元素,然后计算以该栈顶元素值为高的矩形面积,直到当前新元素值>新栈顶元素时,当前新元素值入栈。

代码展示

class Solution{
    public:
    int largestRectangleArea(vector& heights){
        vectornewheights(heights.size()+2,0);//新数组
        for(int i=1;is;
        int ans=0;
        for(int i=0;i

总结

这道题相比于——“接雨水”,那道题,这道题要稍微好理解一点,这道题充分利用了栈“先进后出”的特点,再结合题意,发现是单调栈,总的来说是一道很考验能力的题目,值得多次推敲!

你可能感兴趣的:(Leetcode题解,leetcode,算法,c++)