• 代码随想录(单调栈3)| 84.柱状图中最大的矩形


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

    leetcode题目链接
    文章讲解

    双指针解法

    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            vector<int> minLeftIndex(heights.size());
            vector<int> minRightIndex(heights.size());
            int size = heights.size();
    
            // 记录每个柱子 左边第一个小于该柱子的下标
            minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环
            for (int i = 1; i < size; i++) {
                int t = i - 1;
                // 这里不是用if,而是不断向左寻找的过程
                while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
                minLeftIndex[i] = t;
            }
            // 记录每个柱子 右边第一个小于该柱子的下标
            minRightIndex[size - 1] = size; // 注意这里初始化,防止下面while死循环
            for (int i = size - 2; i >= 0; i--) {
                int t = i + 1;
                // 这里不是用if,而是不断向右寻找的过程
                while (t < size && heights[t] >= heights[i]) t = minRightIndex[t];
                minRightIndex[i] = t;
            }
            // 求和
            int result = 0;
            for (int i = 0; i < size; i++) {
                int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);
                result = max(sum, result);
            }
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    单调栈解法

    // 版本一
    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            int result = 0;
            stack<int> st;
            heights.insert(heights.begin(), 0); // 数组头部加入元素0
            heights.push_back(0); // 数组尾部加入元素0
            st.push(0);
    
            // 第一个元素已经入栈,从下标1开始
            for (int i = 1; i < heights.size(); i++) {
                if (heights[i] > heights[st.top()]) { // 情况一
                    st.push(i);
                } else if (heights[i] == heights[st.top()]) { // 情况二
                    st.pop(); // 这个可以加,可以不加,效果一样,思路不同
                    st.push(i);
                } else { // 情况三
                    while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是while
                        int mid = st.top();
                        st.pop();
                        if (!st.empty()) {
                            int left = st.top();
                            int right = i;
                            int w = right - left - 1;
                            int h = heights[mid];
                            result = max(result, w * h);
                        }
                    }
                    st.push(i);
                }
            }
            return result;
        }
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    今天是训练营最后一天,恭喜坚持两个月的录友们,接下来可以写一篇自己 代码随想录一刷的总结。好好回顾一下,这两个月自己的博客内容,以及自己的收获。

  • 相关阅读:
    JMeter添加插件
    氮化镓充电器芯片 NV6128、NV6127、NV6125 QFN6x8mm
    华为云Stack的学习(四)
    pythonGUI(四)预设按钮
    【Linux】Linux 指令练习题
    libusb-win32使用问题
    Hexo+GitHub搭建个人博客,实现云端编辑、一键发文
    unittest自动化测试框架讲解以及实战
    设计模式-组合模式(Composite)
    如何完成网课答案公众号搭建?小白教程!内附网课题库接口!
  • 原文地址:https://blog.csdn.net/he979731102/article/details/136711883