Leetcode 084 柱状图中最大的矩形

最近鸽了挺多天的,但写leetcode这个习惯还是会继续保持的!

每天更新一道python or C++ leetcode题,力求讲解清晰准确,客官们可以点赞或者关注。

题目:

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

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

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

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

扫描二维码关注公众号,回复: 3073438 查看本文章

示例:

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

算法过程:

这是一个用栈来解决的问题。

首先我们定义我们的stack栈[],这个栈用来储存的是对应矩形的下标。我们希望,这个stack里储存的下标所对应的高度是递增的。如果出现不递增的情况,则代表出现了断层,这时候我们就可以在这个断层处更新我们的最大面积。有人可能会问,如果这些矩形的高度是一直递增的呢?那不就不存在下降的断层嘛?没错,所以我们在heights的末尾处加了一个0,就是为了让面积能在最后结束结算。

具体:

以[2,1,5,6,2,3]为例,它一开始会变为[2,1,5,6,2,3,0]。接着我们把0(第一个元素的下标)添进栈中,接下来遇到的高度是个断层,所以我们pop掉0这个下标,更新面积为heights[0]*1 (结果为2)。接下来的三个下标,1,2,3 分别对应 1, 5, 6 三个高度,所以它们是递增的,所以这时stack保存的下标为[1,2,3],接下来遇到断层,于是我们会逐个蹦出我们的元素,先蹦下标3,更新面积,再蹦下标2,更新面积,但是下标1不会蹦出来,因为下标1和当前下标4的面积还是存在很多种可能性的,我们不能在这里就结束它们之间的联系,意思是说这2个下标在以后的遍历过程中可能会制造更大的面积,所以我们保留。

Python 代码:

class Solution:
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        heights.append(0)
        size = len(heights)
        i = 0
        maxsize = 0
        stack = []
        while i < size:#遍历数组中所有的高度,也就是所有的矩形
            if len(stack) == 0 or heights[stack[-1]] < heights[i]:#如果当前栈是空的或者说构成了一个递增的矩形序列
                stack.append(i)#把当前下标加入栈中
                i += 1#进入下一个矩形
            else:
                j = stack.pop()#如果栈不为空且不构成递增矩形序列关系
                maxsize = max(maxsize, heights[j] * (i if not stack else i - stack[-1] - 1) )#更新最大面积
                
        
        return maxsize

C++代码:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(0);
        stack<int> s;
        int i = 0;
        int maxsize = 0;
        while (i < heights.size()){
            if (s.empty() || heights[s.top()] < heights[i]){
                s.push(i++);
            }
            else{
                int q = s.top();
                s.pop();
                maxsize = max(maxsize, heights[q]*(s.empty()?i:i-s.top()-1));
            }
        }
        return maxsize;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41958153/article/details/82225878