Leetcode 84. 柱状图中最大的矩形(DAY 101) ---- Leetcode Hot 100

本文通过四种不同的C++实现方式探讨了解决最大矩形面积问题的方法。每种实现都逐步优化了算法效率,从最开始的双层循环到利用栈进行优化,最终达到较高的执行效率。文章适合对算法优化感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原题题目


在这里插入图片描述


代码实现(首刷TLE 88/96)


class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int size = heights.size(),ret = 0;
        for(int i=0;i<size;++i)
        {
            ret = max(heights[i],ret);
            int temp = heights[i];
            for(int j=i-1;j>=0;--j)
            {
                temp = min(temp,heights[j]);
                ret = max(temp*(i-j+1),ret);
            }
        }
        return ret;
    }
};

代码实现(首刷绝大部分看解C++)


class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        heights.insert(heights.begin(),0);
        heights.emplace_back(0);

        int size = heights.size(),ret = 0;
        for(int i=0;i<size;++i)
        {
            while(s.size() && heights[s.top()] >heights[i])
            {
                int cur = s.top();
                s.pop();
                int right = i;
                int left = s.top();
                ret = max(ret,(right - left - 1) * (heights[cur]));
            }
            s.emplace(i);
        }
        return ret;
    }
};

代码实现(二刷绝大部分看解 DAY 170 C++)


class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int ret = 0,left = 0,right = 0;
        heights.insert(heights.begin(),0);
        heights.emplace_back(0);
        stack<int> s;
        s.emplace(0);

        for(int i=0;i<heights.size();++i)
        {
            while(s.size() && heights[s.top()] > heights[i])
            {
                int cur = s.top();
                s.pop();
                int left = s.top();
                ret = max(ret,(i-left-1)*heights[cur]);
            }
            s.emplace(i);
        }
        return ret; 
    }
};

代码实现(三刷看解 DAY 255 C++)


class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.insert(heights.begin(),0);
        heights.emplace_back(0);
        

        stack<int> stack;
        stack.emplace(0);

        int size = heights.size();
        int ret = 0;
        for(int i = 0;i < size;++i)
        {
            while(stack.size() && heights[stack.top()] > heights[i])
            {
                int cur = stack.top();
                stack.pop();
                int left = stack.top();
                ret = max(ret,(i - left - 1) * heights[cur]);
            }
            stack.emplace(i);
        }

        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值