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.

参考:http://xpentium.blog.163.com/blog/static/22737815020147795123240/

题目是说matrix中的元素可能有0和1,找出一个子矩阵,这个子矩阵要求是全为1中最大的。如果暴力求解的话,复杂度将直逼O(n^4)。

这有了第一道题的铺垫后,第二道题目就简单了,经过一些变换后,两道题目可以看成等价的。转化的方法是把矩阵中的元素[i][j]的值重置为从[0][j]到[i][j]中在[i][j]之前连续1的个数。

例子中矩阵将变成

0 0 1 0

0 0 0 1

0 1 1 2

0 0 2 3

然后怎么办呢,每一行不就变成了这一行上方的直方图了吗?直接调用上题的解法就OK了,时间复杂度O(n^2)、

 

C++实现代码:

#include<iostream>
#include<vector>
#include<stack>
using namespace std;

class Solution
{
public:
    int maximalRectangle(vector<vector<char> > &matrix)
    {
        if(matrix.empty()||matrix[0].empty())
            return 0;
        int row=matrix.size();
        int col=matrix[0].size();
        int i,j;
        vector<vector<int> > heights(row,vector<int>(col));
        int ret=0;
        for(j=0; j<col; j++)
            heights[0][j]=matrix[0][j]=='1'?1:0;
        for(i=1; i<row; i++)
        {
            for(j=0; j<col; j++)
            {
                if(matrix[i][j]=='0')
                    heights[i][j]=0;
                else
                    heights[i][j]=heights[i-1][j]+1;
            }
        }
        for(i=0; i<row; i++)
        {
            int area=largestRectangleArea(heights[i]);
            ret=max(ret,area);
        }
        return ret;
    }
    int largestRectangleArea(vector<int> &height)
    {
        if(height.empty())
            return 0;
        int i,j;
        int minH;
        int maxArea=0;
        int n=height.size();
        for(i=0; i<n; i++)
        {
            minH=height[i];
            for(j=i; j<n; j++)
            {
                minH=min(minH,height[j]);
                maxArea=max(maxArea,minH*(j-i+1));
            }
        }
        return maxArea;
    }
};

int main()
{
    Solution s;
    vector<vector<char> > ch={{'0','0','1','0'},{'0','0','0','1'},{'0','1','1','1'},{'0','0','1','1'}};
    cout<<s.maximalRectangle(ch)<<endl;
}

 

时间: 2024-08-04 11:10:54

Maximal Rectangle的相关文章

[LeetCode]*85.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. 思路 对于上图的一个01矩阵.我们可以一行一行的分析,假设第三行,我们按列扫描,遇到0时,柱子断开,重新形成柱子,遇到1时柱子高度加一.这样的话,我们就可以把问题转换为[LeetCode]*84.Largest Rectangle in Histogram求

UVa 10545 Maximal Quadrilateral:有内切圆的四边形面积

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1486 公式参考维基百科  但还是觉得哪里不对(待研究,坑) 完整代码: 01./*0.018s*/ 02. 03.#include<cstdio> 04.#include<cmath> 05. 06.int main() 07.{ 08

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

POJ 2559 / HDU 1506 Largest Rectangle in a Histogram (DP)

Largest Rectangle in a Histogram http://poj.org/problem?id=2559 Time Limit: 1000MS Memory Limit: 65536K Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may

flash Rectangle参数的问题

ar secondRect:Rectangle = new Rectangle(1, 3, 11, 13); 以上代码为什么会报错,说Rectangle参数不能超过二个.为什么呢?望高手说说吧 var secondRect:Rectangle = new Rectangle(1, 3, 11, 13); 不会报错,你看看脚本是2.0还是3.0的 package { import flash.display.Sprite; import flash.geom.Rectangle; public c

c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

问题描述 为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的 #include using namespace std; class rectangle { protected: double length,width,l,w; public: void setlength(); void getlength(); void setwidth(); void getwidth(); double area(); double perimeter(); dou

type parameters of &lt;T&gt;T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object

今天在进行代码检查的时候出现下面的异常: 1 type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object 当时的第一感觉就是代码因为jdk版本太低引起的. 因为最后咨询了配置管理组的同事,确实发现是因为我本地jdk用的是1.7版本,而代码检查机器上用的是jdk1.6版本.因此出现