`
frank-liu
  • 浏览: 1682392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Maximal Rectangle

 
阅读更多

问题描述:

 

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.

原问题链接:https://leetcode.com/problems/maximal-rectangle/

 

问题分析

  这个问题的解决思路其实依赖于前面一篇文章里求柱状图最大覆盖面积的思路。在前面的问题里,是针对一组数字求它所涵盖的面积。而这里因为提供的元素是一个矩阵,我们可以将它最初的一行当做一个柱状图,这样就可以得到一个最初始的最大涵盖面积。

  当然,这只是针对最初始的情况。而这里因为是要求整个矩阵中标记为1的最大涵盖矩阵。我们再需要结合后面的行来考虑。以如下的矩阵为例:

1 1 0 1 0 1

0 1 0 0 1 1

1 1 1 1 0 1

1 1 1 1 0 1

  我们得到它们第一行的height数组是1 1 0 1 0 1,那么按照第一步我们计算出来的最大涵盖面积是2。在结合第二行的值时,我们更新第一行的数据。如果第二行里的元素是0,那么就将对应索引里的元素值更新为0,否则就是在原有索引的数值基础上加1。这样结合第二行我们得到的height数组是0 2 0 0 1 2,在用前面的办法来计算它的柱状图最大涵盖矩阵面积,得到它的最大面积是2。

  我们依次按照上面的办法比较,最终可以得到如下的代码:

 

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 < 1)
            return 0;
        int[] stack = new int[height.length + 1];
        int len = 0, max = 0;
        for (int i = 0; i <= height.length; i++) {
            int h = (i == height.length) ? 0 : height[i];
            while (len != 0 && (i == height.length || height[stack[len - 1]] > h)) {
                if (len == 1)
                    max = Math.max(height[stack[--len]] * i, max);
                else
                    max = Math.max(height[stack[--len]] * (i - stack[len - 1] - 1), max);
            }
            stack[len++] = i;
        }
        return max;
    }
}

 

参考材料

https://leetcode.com/discuss/52670/solution-based-maximum-rectangle-histogram-with-explanation

https://leetcode.com/discuss/104498/java-5ms-100%25-solution-by-modifying-bu-will-9s-solution

分享到:
评论

相关推荐

    java-leetcode题解之Maximal Rectangle.java

    java java_leetcode题解之Maximal Rectangle.java

    leetcode316-LeetCode:leetcode的解决方案

    Rectangle:单调栈(Histogram变形) Largest Rectangle in Histogram:单调栈 Island Perimeter:简单对比(map+zip的使用) or 遍历查找 Max Area of Island:DFS(本来想用DP,发现出不来) Number of Islands:DFS My ...

    dna匹配leetcode-leetcode:leetcode刷题

    Rectangle 栈 局部递增 或者 动态规划 Binary Tree Inorder Traversal 栈 递归 Single Number 异或 Copy List with Random Pointer 单链表 map Max Points on a Line 斜率 map, int&gt; Fraction to Recurring Decimal ...

    leetcode中国-leetcode:leetcode刷题

    maximal rectangle :dp问题,较难 largestRectangleArea 求直方图的最大面积,左右两次扫面+剪枝优化 Valid Parentheses 用栈判断括号匹配 Regular Expression Matching 递归匹配 wildcard matching 动态规划 ...

    leetcode分类-LeetCode:力码

    leetcode 分类 LeetCode Progress 128/154 Other Solutions C++,有详细思路解释 python,部分有解释 Java,部分有解释 ...norvig神牛Python代码...Rectangle ###Recursion N-Queens N-Queens II Balanced Binary Tree Binar

    lrucacheleetcode-leetcode:leetcode

    Rectangle Monotonic stack for 2d array 239. Sliding Window Maximum 255. Verify Preorder Sequence in Binary Search Tree 907. Sum of Subarray Minimums 二叉搜索树 99. Recover Binary Search Tree 109. ...

    python-leetcode题解之085-Maximal-Rectangle

    python python_leetcode题解之085_Maximal_Rectangle

    js-leetcode题解之85-maximal-rectangle.js

    javascript js_leetcode题解之85-maximal-rectangle.js

    c语言-leetcode题解之0085-maximal-rectangle.zip

    c语言基础 c语言_leetcode题解之0085_maximal_rectangle.zip

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    Leetcode题目+解析+思路+答案.pdf

    - **Maximal Rectangle**:在二维矩阵中找到最大的矩形。 - **Palindrome Number**:判断一个数字是否是回文数。 - **Search a 2D Matrix**:在二维矩阵中搜索目标值。 - **Search for a Range**:在一个排序...

    LeetCode C++全解

    1. Introduction 2. Array i. Remove Element ... Maximal Rectangle x. Palindrome Number xi. Search a 2D Matrix xii. Search for a Range xiii. Search Insert Position xiv. Find Peak Element

    LeetCode leetcode部分题解答代码实现

    * Maximal Rectangle:给定一个矩形,返回矩形中的最大子矩形。这个题目需要使用动态规划的思想,将矩形分解成更小的矩形,并找到最大矩形。 2. 位操作 位操作是 LeetCode 中的一种常见题型,下面是一些关于位操作...

    leetcode和oj-ProgProblems:程序问题

    leetcode 和 oj 编程问题 在线裁判网站问题解决方案 如果您遇到这个问题并对如何更好地完成某些解决方案有建议或意见,欢迎您。 palin.ml : ...MaximalRectangle : oj.leetcode 问题的java解决方案

    LeetCode练习答案

    - **最大矩形(Maximal Rectangle)**: 在由'0'和'1'组成的二维矩阵中,找到只包含'1'的最大矩形,并返回其面积。 - **回文数(Palindrome Number)**: 判断一个整数是否是回文数。 - **搜索二维矩阵(Search a 2D Matrix...

    3、动态规划必练题(含解法).pdf

    12. **Maximal Rectangle** (最大的矩形) 在一个01矩阵中找到最大的1构成的矩形。利用汉诺塔和单调栈解决。 13. **Maximal Square** (最大的正方形) 找到01矩阵中最大的全1子矩阵。可以使用动态规划和单调栈或...

Global site tag (gtag.js) - Google Analytics