【算法】lc两道单调栈的应用

单调栈最经典的应用就是 找到数组中某个数左边第一个比它小的数

回顾回顾模板

常见模型:找出每个数左边离它最近的比它大/小的数
int tt = 0;
for (int i = 1; i <= n; i ++ )
{
    while (tt && check(stk[tt], i)) tt -- ;
    stk[ ++ tt] = i;
}

这两道题就是典型应用

84. 柱状图中最大的矩形

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

alt

85. 最大矩形


给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。


alt

对于第一题,维护一个单调递增的栈,当枚举到当前柱子时,若栈顶元素的值比它大,则将栈顶元素pop出,直到栈顶元素的值小于等于它为止,则栈顶元素记录的就是左边第一个比它小的元素的位置,最后把当前元素加入到栈中,继续维护栈的单调性找出该柱子左边第一个比他矮的柱子,下标相减即使最大矩形的宽度。即可求出答案。

对于第二题,这题是上题的pro版本,需要我们手动求出每个柱子的高度,

我们用h[i][j]表示改点往上的最大连续1的高度

如果m[i][j] == '1' 则h[i][j] = h[i - 1][j] + 1;

然后我们去枚举每一个水平线,通过上一题的方式就能求出以当前水平线的最大矩形面积

code1

class Solution {
    public int largestRectangleArea(int[] h) {
        Stack<Integer> stk = new Stack<>();
        int n = h.length;
        int[] left = new int[n];
        int[] right = new int[n];

        //找到左边第一个比i小的数的位置
        for(int i = 0;i < n; i ++){
            while(!stk.isEmpty() && h[stk.peek()] >= h[i])stk.pop();
            if(stk.isEmpty())left[i] = -1; //左边没有比i小的数
            else left[i] = stk.peek();
            stk.push(i);
        }

        //清空栈
        stk = new Stack<>();

        //找到右边第一个比i小的数的位置
        for(int i = n - 1; i >= 0; i --){
            while(!stk.isEmpty() && h[stk.peek()] >= h[i])stk.pop();
            if(stk.isEmpty())right[i] = n; //左边没有比i小的数
            else right[i] = stk.peek();
            stk.push(i);
        }
        //枚举每个高度
        int res = 0;
        for(int i = 0; i < n; i ++){
            res = Math.max(res,h[i] * (right[i] - left[i] - 1));
        }
        return res;
    }
}

code2

class Solution {
    public int maximalRectangle(char[][] matrix) {
        int n = matrix.length;
        if(n == 0)return 0;
        int m = matrix[0].length;

        int[][] h = new int [n][m];

        for(int i = 0; i < n; i ++){
            for(int j = 0; j < m; j ++){
                if(matrix[i][j] == '1'){
                    if(i > 0)h[i][j] = h[i - 1][j] + 1;
                    else h[i][j] = 1;
                }
                    
                
               
            }
        }
        int res = 0;

        //枚举每一水平线
        for(int i = 0; i < n; i ++){
            res = Math.max(res,largestRectangleArea(h[i]));
        }
        return res;
    }

    public int largestRectangleArea(int[] h) {
        Stack<Integer> stk = new Stack<>();
        int n = h.length;
        int[] left = new int[n];
        int[] right = new int[n];

        //找到左边第一个比i小的数的位置
        for(int i = 0;i < n; i ++){
            while(!stk.isEmpty() && h[stk.peek()] >= h[i])stk.pop();
            if(stk.isEmpty())left[i] = -1; //左边没有比i小的数
            else left[i] = stk.peek();
            stk.push(i);
        }

        //清空栈
        stk = new Stack<>();

        //找到右边第一个比i小的数的位置
        for(int i = n - 1; i >= 0; i --){
            while(!stk.isEmpty() && h[stk.peek()] >= h[i])stk.pop();
            if(stk.isEmpty())right[i] = n; //右边没有比i小的数
            else right[i] = stk.peek();
            stk.push(i);
        }
        //枚举每个高度
        int res = 0;
        for(int i = 0; i < n; i ++){
            res = Math.max(res,h[i] * (right[i] - left[i] - 1));
        }
        return res;
    }
}
全部评论

相关推荐

双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务