ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)

2021-09-16 12:05:00  阅读:195  来源: 互联网

标签:Maximal valueStack indexStack int heights Stack new leetcode 85


题目

https://leetcode.com/problems/maximal-rectangle/
在这里插入图片描述

题解

本题与 leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈) 思路相同,直接抄了原来的代码。

也可参考之前的博客:左神算法:求最大子矩阵的大小(Java版)

另外,想到了另外一道类似但思路不同的题:221. Maximal Square

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if (matrix.length == 0) return 0;
        int M = matrix.length;
        int N = matrix[0].length;
        
        int[][] heights = new int[M][N]; // 上方有多少个连续的1
        for (int i = 0; i < N; i++) {
            heights[0][i] = matrix[0][i] - '0';
            for (int j = 1; j < M; j++) {
                if (matrix[j][i] == '1') heights[j][i] = heights[j - 1][i] + 1;
                else heights[j][i] = 0;
            }
        }
        int result = 0;
        for (int i = 0; i < M; i++) {
            result = Math.max(largestRectangleArea(heights[i]), result);
        }
        return result;
    }

    // leetcode 84. Largest Rectangle in Histogram
    public int largestRectangleArea(int[] heights) {
        int L = heights.length;
        // 找左边第一个小于h[i]的数
        // 从右向左遍历,维护单调不减栈,小数h[i]不断将大数h[j]弹出,则h[i]左边第一个小于h[i]的数为h[j]
        Stack<Integer> valueStack = new Stack<>();
        Stack<Integer> indexStack = new Stack<>();
        int[] leftIndex = new int[L]; // i左边第一个小于i的数的下标
        Arrays.fill(leftIndex, -1);
        for (int i = L - 1; i >= 0; i--) {
            while (!valueStack.isEmpty() && valueStack.peek() > heights[i]) {
                leftIndex[indexStack.pop()] = i;
                valueStack.pop();
            }
            valueStack.push(heights[i]);
            indexStack.push(i);
        }
        // 找右边第一个小于h[i]的数
        // 从左向右遍历,维护单调不减栈
        valueStack = new Stack<>();
        indexStack = new Stack<>();
        int[] rightIndex = new int[L]; // i右边第一个小于i的数的下标
        Arrays.fill(rightIndex, L);
        for (int i = 0; i < L; i++) {
            while (!valueStack.isEmpty() && valueStack.peek() > heights[i]) {
                rightIndex[indexStack.pop()] = i;
                valueStack.pop();
            }
            valueStack.push(heights[i]);
            indexStack.push(i);
        }

        // 对于每个h[i],以其自身的高度,分别向左右扩张
        int maxArea = 0;
        for (int i = 0; i < L; i++) {
            maxArea = Math.max(maxArea, (rightIndex[i] - leftIndex[i] - 1) * heights[i]);
        }
        return maxArea;
    }
}

在这里插入图片描述

标签:Maximal,valueStack,indexStack,int,heights,Stack,new,leetcode,85
来源: https://blog.csdn.net/sinat_42483341/article/details/120326122

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有