算法刷题Day 60 柱状图中的最大矩阵

Day 60 单调栈

84. 柱状图中最大的矩形

暴力解法

超时了

分别找出当前位置左边第一个 比自己小的索引(的后一个位置)和右边第一个比自己小的索引(的前一个位置),这个范围之内,就是以当前位置的高度所能达到的最大宽度。

cpp 复制代码
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int maxArea = 0;

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

            for (int j = i; j >= 0; --j)
            {
                if (heights[j] < heights[i])
                {
                    break;
                }
                else
                {
                    leftLowerIdx = j;
                }
            }

            for (int j = i; j < heights.size(); ++j)
            {
                if (heights[j] < heights[i])
                {
                    break;
                }
                else
                {
                    rightLowerIdx = j;
                }
            }

            int area = heights[i] * (rightLowerIdx - leftLowerIdx + 1);
            if (area > maxArea)
            {
                maxArea = area;
            }
        }

        return maxArea;
    }
};

双指针

cpp 复制代码
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        vector<int> leftLower(heights.size(), 0);
        leftLower[0] = -1; // 注意这个地方是 - 1,否则会导致死循环

        for (int i = 1; i < heights.size(); ++i)
        {
            int t = i - 1; 
            while (t >= 0 && heights[t] >= heights[i])
            {
                t = leftLower[t];
            }
            leftLower[i] = t;
        }

        vector<int> rightLower(heights.size(), 0);
        rightLower.back() = heights.size(); // 注意这个地方的值为heights.size(),否则会导致死循环

        for (int i = heights.size() - 2; i >= 0; --i)
        {
            int t = i + 1;
            while (t < heights.size() && heights[t] >= heights[i])
            {
                t = rightLower[t];
            }
            rightLower[i] = t;
        }

        int maxArea = 0;
        for (int i = 0; i < heights.size(); i++)
        {
            int area = heights[i] * (rightLower[i] - leftLower[i] - 1);
            if (area > maxArea)
            {
                maxArea = area;
            }
        }

        return maxArea;
    }
};

单调栈

有了接雨水那道题的经验,这一道题可以模仿着做出了

cpp 复制代码
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int maxArea = 0;
        stack<int> incStk;
        incStk.push(-1);
        heights.push_back(-1);

        for (int i = 0; i < heights.size(); ++i)
        {
            while (incStk.top() != -1 && heights[incStk.top()] > heights[i])
            {
                int idx = incStk.top();
                incStk.pop();
                int w = i - incStk.top() - 1;
                int area = heights[idx] * w;
                if (area > maxArea)
                {
                    maxArea = area;
                }
            }
            incStk.push(i);
        }

        return maxArea;
    }
};
相关推荐
DuHz8 分钟前
论文解读:用于数据分析的极值点对称模态分解方法 (Extreme-point Symmetric Mode Decomposition,ESMD)
论文阅读·算法·信息与通信·信号处理
HZZD_HZZD27 分钟前
用电负荷聚类分析实战:基于`scikit-learn`的`K-Means`与`DBSCAN`双算法对比、`PCA`降维可视化与智能电表负荷画像全流程
算法·scikit-learn·kmeans
MIngYaaa52040 分钟前
2026暑期牛客多校1 2026-7-17
数据结构·算法
wabs66641 分钟前
关于图论【卡码网107.寻找存在的路线的思考】
数据结构·算法·图论
半兽先生1 小时前
大模型技术开发与应用——4.大模型提示词工程实战
人工智能·算法
wuminyu1 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法
hhzz2 小时前
机器学习-算法模型系列文章:07-SVM 一巴掌拍出来的超平面:SVM核函数选错,再干净的数据也救不了你
算法·机器学习·支持向量机
geovindu2 小时前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
zander2582 小时前
LeetCode 79. 单词搜索
算法·深度优先