leetcode 84. 柱状图中最大的矩形

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

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

 

题解:

1.包含n个非负整数的数组

2.元素值表示柱子高度

3.能拼接出来的最大矩形面积

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

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

示例:

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

输出: 10

 

解题思路:暴力搜索超时,单调栈优化

  • 在柱高数组中找一个升序子序列,在这个子序列的后一个元素上其柱高度均比该子序列柱高要低,此时更新最大面积

  • 这样在柱高数组后添加一个为0的柱高才能找出整个数组中的最优值

  • 单调栈存放这个子序列的下标

  • 注意栈为空和不为空时,矩形长高的计算;为空,此时子序列的后一个元素柱高位矩形高,长的值等于子序列后一元素的下标值;不为空则计算矩形长为子序列后一元素下标减此时柱高元素的前一下标减1(即此时形成的矩形的长)

C/C++题解:

class Solution {

public:

    int largestRectangleArea(vector<int>& heights) {

        stack<int> s;  //单调栈记录遍历元素下标

        int ans = 0;  //记录最大面积

        heights.push_back(0); //为寻找整个数组中形成的最大面积

        for (int i = 0; i < heights.size(); ++i){

            while (!s.empty() && heights[s.top()] >= heights[i])

            {//找到一升序子序列,子序列后一元素值小于子序列最后元素

                int h = heights[s.top()];

                s.pop();//获取柱子高度代表矩形高度

                if (s.empty()) //计算子序列中大于当前柱高度的

                    ans = max(ans, i * h); 

                else //下标计算矩形长度

                    ans = max(ans, (i - s.top() - 1) * h);}

            s.push(i); }//向栈中写入柱子下标

        return ans;}};

Debug结果:

Java题解:

class Solution {

    public int largestRectangleArea(int[] heights) {

        Stack<Integer> s = new Stack<Integer>();  //单调栈记录遍历元素下标

        int ans = 0;  //记录最大面积

        int[] height = new int[heights.length+1];

        for(int i=0;i<heights.length;i++) {

            height[i]=heights[i];

        }//在数组末尾添加一个柱高为0的柱子,寻找整个数组中形成的最大面积

        for (int i = 0; i < height.length; i++) {

            while (!s.isEmpty() && height[s.peek()] >= height[i])

            {//找到一升序子序列,子序列后一元素值小于子序列最后元素

                int h = height[s.pop()];//获取柱子高度代表矩形高度

                if (s.isEmpty()) //计算子序列中大于当前柱高度的

                    ans = Math.max(ans, i * h); 

                else //下标计算矩形长度

                    ans = Math.max(ans, (i - s.peek() - 1) * h);}

            s.push(i); }//向栈中写入柱子下标

        return ans; }}

Debug结果:

Python题解:

class Solution(object):

    def largestRectangleArea(self, heights):

        """ :type heights: List[int]:rtype: int"""

        s = [] #单调栈记录遍历元素下标

        ans = 0 #记录最大面积

        heights.append(0) #为寻找整个数组中形成的最大面积

        for i in range(len(heights)):

            while s and heights[s[-1]] >= heights[i]:

            #找到一升序子序列,子序列后一元素值小于子序列最后元素

                h = heights[s[-1]]

                s.pop()#获取柱子高度代表矩形高度

                if not s: #计算子序列中大于当前柱高度的

                    ans = max(ans, i * h)

                else: #下标计算矩形长度

                    ans = max(ans, (i - s[-1] - 1) * h)

            s.append(i) #向栈中写入柱子下标

        return ans

Debug结果:

更多题解移步公众号免费获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值