Hard-题目30:85. Maximal Rectangle

原创 2016年05月31日 23:42:26

题目原文:
Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing all ones and return its area.
题目大意:
给出一个0-1矩阵,求出最大的全1矩阵。
题目分析:
(这也是原创的)朴素解法就是dfs,复杂度貌似为O(4n)就不谈了。
然后考虑DP,注意本题在Leetcode的题号是85题,好眼熟啊。刚才做到Hard-题目27:84. Largest Rectangle in Histogram是求直方图的最大面积。好像找到了什么关联对不对?没错,我们可以把这个0-1矩阵的第i行以上的子矩阵看做一个直方图,那么求每个子矩阵的直方图的面积最大值的最大值(好绕,看懂了么)就是题目的要求啦。
那么就好办了,直接调用Hard第27题的代码就行了。
源码:(language:java)
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0;

    int[] height = new int[matrix[0].length];
    for(int i = 0; i < matrix[0].length; i ++){
        if(matrix[0][i] == '1') height[i] = 1;
    }
    int result = largestInLine(height);
    for(int i = 1; i < matrix.length; i ++){
        resetHeight(matrix, height, i);
        result = Math.max(result, largestInLine(height));
    }

    return result;
}

private void resetHeight(char[][] matrix, int[] height, int idx){
    for(int i = 0; i < matrix[0].length; i ++){
        if(matrix[idx][i] == '1') height[i] += 1;
        else height[i] = 0;
    }
}    

public int largestInLine(int[] height) {
    if(height == null || height.length == 0) return 0;
    int len = height.length;
    Stack<Integer> s = new Stack<Integer>();
    int maxArea = 0;
    for(int i = 0; i <= len; i++){
        int h = (i == len ? 0 : height[i]);
        if(s.isEmpty() || h >= height[s.peek()]){
            s.push(i);
        }else{
            int tp = s.pop();
            maxArea = Math.max(maxArea, height[tp] * (s.isEmpty() ? i : i - 1 - s.peek()));
            i--;
        }
    }
    return maxArea;
}

}
成绩:
27ms,64.32%,32ms,8.41%

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

LeetCode --- 85. Maximal Rectangle

题目链接:Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle...
  • makuiyu
  • makuiyu
  • 2015年04月03日 17:09
  • 2206

leetcode_question_85 Maximal Rectangle

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones an...
  • doc_sgl
  • doc_sgl
  • 2013年09月19日 17:29
  • 14387

LeetCode85——Maximal Rectangle

初看这道题有点不知所措,但是其实是LeetCode84——Largest Rectangle in Histogram的一个变形。...
  • zhangxiao93
  • zhangxiao93
  • 2016年01月28日 20:44
  • 1400

LeetCode 85 Maximal Rectangle (Python详解及实现)

【题目】 Given a 2D binary matrix filled with 0'sand 1's, find the largest rectangle containing only 1'...
  • yangjingjing9
  • yangjingjing9
  • 2017年08月09日 16:37
  • 209

LeetCode85 Maximal Rectangle java题解

public static int maximalRectangle(char[][] matrix) { int rowNum=matrix.length; if(rowNum=...
  • u012249528
  • u012249528
  • 2015年06月30日 09:01
  • 772

算法学习之动态规划(leetcode 85. Maximal Rectangle)

85. Maximal Rectangle
  • maxiaotiaoti
  • maxiaotiaoti
  • 2017年03月15日 16:59
  • 1152

Leetcode:85. Maximal Rectangle

Difficulty: Hard Ac 44msGiven a 2D binary matrix filled with 0’s and 1’s, find the largest rectangl...
  • ofantasyx
  • ofantasyx
  • 2016年05月01日 12:28
  • 130

[LeetCode] 85. Maximal Rectangle

LeetCode
  • hiimdaosui
  • hiimdaosui
  • 2016年08月03日 17:59
  • 109

leetCode 85. Maximal Rectangle

Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and...
  • liujunzxcv
  • liujunzxcv
  • 2017年09月25日 11:59
  • 55

[Leetcode] 85. Maximal Rectangle

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and...
  • u013897903
  • u013897903
  • 2015年04月01日 02:43
  • 276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hard-题目30:85. Maximal Rectangle
举报原因:
原因补充:

(最多只允许输入30个字)