刷题day54:柱形图中最大矩形

题意描述:

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

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

 暴力方法:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        int result = 0;
        for(int i = 0; i < n; i++){
            int height = heights[i];
            int left = i, right = i;
            while(left - 1 >= 0 && heights[left - 1] >= height){
                left--;
            }
            while(right + 1 < n && heights[right + 1] >= height){
                right++;
            }
            result = max(result, (right - left + 1) * height);
        }
        return result;
    }
};

复杂度为O(n*n)。会超时

利用单调栈思路:

首先单调栈的代码如下:

stack<int> st;
for(int i = 0; i < nums.size(); i++)
{
	while(!st.empty() && st.top() > nums[i])
	{
		st.pop();
	}
	st.push(nums[i]);
}

单调栈:维护一个单独递增的栈,只有放入元素比栈顶元素大才入栈,否则一直pop +计算最大面积。栈中初始化一个0,数组的末尾添加一个元素0,这样才能计算所有的情况(或者说清空栈)。

以heights = [2,1,5,6,2,3]为例说明:.

加入0后heights =  [0, 2,1,5,6,2,3, 0];

heights[i]栈中元素下标当前矩形最大面积操作情况
heights[0] = 0s = [0]00入栈
heights[1] = 2s = [0,1]01入栈
heights[2]=1 < 2s=[0]2

栈顶元素1出栈

面积= 2*(2-0-1)=2

heights[3]=5s=[0,2,3]23入栈
heights[4]=6s=[0,2,3,4]24入栈
heights[5]=2<heights[4]=6s=[0,2,3]6

4出栈

面积= 6*(5-3-1) = 6

heights[5]=2<heights[3]=5s=[0,2]10

3出栈

面积= 5*(5-2-1) = 10

2>heights[2]=1s=[0,2,5]105入栈
heights[6]=3s=[0,2,5,6]106入栈
heights[7]=0 < heights[6]=3s=[0,2,5]10

6出栈

面积= 3*(7-5-1) = 3

heights[7]=0< heights[5]=2s=[0,2]10

5出栈

面积= 2*(7-2-1) = 8

heights[7]=0< heights[2]=1s=[0]10

2出栈

面积= 1*(7-0-1) = 6

heights[7]=0s=[0,7]输出10

完整C++代码如下:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        int result = 0;
        heights.insert(heights.begin(), 0);
        heights.emplace_back(0);
        for(int i = 0; i < heights.size(); i++){
            while(!st.empty() && heights[st.top()] > heights[i]){
                int height = heights[st.top()];
                st.pop();
                int width = i - st.top() - 1;
                result = max(result, height * width);
            }
            st.push(i);
        }
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值