美文网首页
LeetCode 第86题:最大矩形

LeetCode 第86题:最大矩形

作者: 放开那个BUG | 来源:发表于2021-05-27 21:46 被阅读0次

    1、前言

    题目描述

    2、思路

    这道题最有用也是最有意义的一种解法是:将此题转化为寻找柱状图中最大矩形的问题。怎么转换呢?

    首先,我们遍历 matrix 的每一行,将每一行1的个数作为 height 的数组的值,也就是矩形的高度。那么问题就简单了,我们只需要遍历每一行,求 height 数组的值,然后将数组输入求最大矩形面积。到最后留下的最大的,也就是二维数组中的最大矩形。

    3、代码

    class Solution {
        public int maximalRectangle(char[][] matrix) {
            if(matrix == null || matrix.length == 0 ||matrix[0].length == 0){
                return 0;
            }
    
            int m = matrix.length, n = matrix[0].length;
            int[] heights = new int[n];
            int maxArea = 0;
    
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(matrix[i][j] == '1'){
                        heights[j] += 1;
                    }else {
                        heights[j] = 0;
                    }
                }
    
                maxArea = Math.max(maxArea, largestRectangleArea(heights));
            }
    
            return maxArea;
        }
    
        private int largestRectangleArea(int[] heights){
            if(heights == null || heights.length == 0){
                return 0;
            }
    
            int m = heights.length;
            int[] leftMemo = new int[m];
            leftMemo[0] = -1;
            for (int i = 1; i < heights.length; i++) {
                int left = i - 1;
                while(left >= 0 && heights[left] >= heights[i]){
                    left = leftMemo[left];
                }
    
                leftMemo[i] = left;
            }
    
            int[] rightMemo = new int[m];
            rightMemo[m - 1] = m;
            for (int i = m - 2; i >= 0; i--) {
                int right = i + 1;
                while(right < m && heights[right] >= heights[i]){
                    right = rightMemo[right];
                }
                rightMemo[i] = right;
            }
    
            int max = 0;
            for (int i = 0; i < heights.length; i++) {
                max = Math.max(max, (rightMemo[i] - leftMemo[i] - 1) * heights[i]);
            }
    
            return max;
        }
    }
    

    相关文章

      网友评论

          本文标题:LeetCode 第86题:最大矩形

          本文链接:https://www.haomeiwen.com/subject/mcqudltx.html