算法刷题 Day 60 | ● 84.柱状图中最大的矩形

84.柱状图中最大的矩形

有了之前单调栈的铺垫,这道题目就不难了。

https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.html

Tips:这道题我用了自己想出来的解法,两遍单调栈,分别找到左边和右边比当前柱子矮的坐标,然后再for循环一遍计算出每个柱子所能延展出来的矩形面积即可。

我的题解:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        // 两遍单调栈,分别找到左边和右边比当前柱子矮的坐标
        // 然后再for循环一遍计算出每个柱子所能延展出来的矩形面积即可
        stack<int> st;
        vector<int> leftMin(heights.size(),-1);
        vector<int> rightMin(heights.size(),heights.size());

        for(int i=0; i<heights.size(); i++){
            while(!st.empty() && heights[i] < heights[st.top()]){
                rightMin[st.top()] = i;
                st.pop();
            }

            if(st.empty() || heights[i] >= heights[st.top()]){
                st.push(i);
            }
        }

        stack<int>().swap(st);

        for(int i=heights.size()-1; i>=0; i--){
            while(!st.empty() && heights[i] < heights[st.top()]){
                leftMin[st.top()] = i;
                st.pop();
            }

            if(st.empty() || heights[i] >= heights[st.top()]){
                st.push(i);
            }
        }

        int result = 0;
        for(int i = 0; i<heights.size(); i++){
            int temp = heights[i] * (rightMin[i] - leftMin[i] - 1);
            result = max(result,temp);
        }
        return result;
    }
};

 

posted @   GavinGYM  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示