第一种方法是利用DP。时间复杂度是 O(m * m * n)

dp(i,j):矩阵中同一行以(i,j)结尾的所有为1的最长子串长度

代码例如以下:

    int maximalRectangle(vector<vector<char> > &matrix) {
int m = matrix.size();
if (m == 0) return 0;
int n = matrix[0].size();
if (n == 0) return 0;
vector<vector<int>> dp(m, vector<int>(n));
int maxArea = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '0') continue;
dp[i][j] = (j == 0 ? 1 : dp[i][j - 1] + 1);
int minX = dp[i][j];
for (int k = 1; k <= i + 1; k++)
{
minX = min(minX, dp[i - k + 1][j]);
maxArea = max(maxArea, minX * k);
}
}
}
return maxArea;
}

另外一种方法:

来自https://oj.leetcode.com/discuss/5198/a-o-n-2-solution-based-on-largest-rectangle-in-histogram

事实上这里和 Largest Rectangle in Histogram是类似的,

之前的dp(i,j)保存以第i行。第j列结尾的,同一行中连续1的个数;那么这里我们用一个数组x,使x[j]保存当前行第j列中的连续1的个数。之后按行遍历,每一行都按Largest Rectangle in Histogram的算法处理一遍

代码例如以下:复杂度为O(m*n)

    int maximalRectangle(vector<vector<char> > &matrix) {
int m = matrix.size();
if (m == 0) return 0;
int n = matrix[0].size();
if (n == 0) return 0;
vector<int> height(n);
int maxArea = 0;
for (int i = 0; i < m; i++)
{
vector<int> index;
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '0') height[j] = 0;
else height[j] ++;
while (index.size() && height[j] <= height[index.back()])
maxArea = max(getArea(height, index, j), maxArea);
index.push_back(j);
}
while (index.size())
maxArea = max(getArea(height, index, height.size()), maxArea);
}
return maxArea;
} int getArea(vector<int> &height, vector<int>& index, int start)
{
int areaH = height[index.back()];
index.pop_back();
int end = index.empty() ? -1 : index.back();
return (start - end - 1) * areaH;
}

第三种方法:

利用极值http://hi.baidu.com/mzry1992/item/030f9740e0475ef7dc0f6cba

H[i][j] = 0                    matrix[i][j] = '0'

H[i-1][j] + 1     matrix[i][j] = '1'

L[i][j] = max{L[i-1][j], 第i行左边第一个'0'的位置+1}

R[i][j] = min{R[i-1][j], 第i行右边第一个'0'的位置-1}

maxArea = max{maxArea, H[i][j] * (R[i][j] - L[i][j] + 1)}

因为H,L,R均仅仅用到i-1,j的内容,能够将空间进一步压缩成为O(N)的

代码例如以下:

    int maximalRectangle(vector<vector<char> > &matrix) {
int m = matrix.size();
if (m == 0) return 0;
int n = matrix[0].size();
if (n == 0) return 0;
vector<int> h(n);
vector<int> l(n);
vector<int> r(n, n - 1);
int maxArea = 0, maxL = 0, minR = m - 1;
for (int i = 0; i < m; i++)
{
maxL = 0, minR = n-1;
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '0')
{
h[j] = 0;
l[j] = 0;
r[j] = n - 1;
maxL = j + 1;
}
else
{
h[j]++;
l[j] = max(l[j], maxL);
}
} for (int j = n - 1; j >= 0; j--)
{
if (matrix[i][j] == '0')
{
r[j] = n - 1;
minR = j - 1;
}
else
{
r[j] = min(r[j], minR);
maxArea = max(maxArea, h[j] * (r[j] - l[j] + 1));
}
}
}
return maxArea;
}

Maximal Rectangle [leetcode] 的三种思路的更多相关文章

  1. 简谈百度坐标反转至WGS84的三种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...

  2. Reorder List [leetcode] 这两种思路

    第一个想法随着vector保存全部Node* 表拼接出来 void reorderList(ListNode *head) { vector<ListNode*> content; Lis ...

  3. Java中实现十进制数转换为二进制的三种思路

    Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...

  4. Jump Game 的三种思路 - leetcode 55. Jump Game

    Jump Game 是一道有意思的题目.题意很简单,给你一个数组,数组的每个元素表示你能前进的最大步数,最开始时你在第一个元素所在的位置,之后你可以前进,问能不能到达最后一个元素位置. 比如: A = ...

  5. JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...

  6. Maximal Rectangle [LeetCode]

    Problem Description: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle co ...

  7. Maximal Rectangle leetcode java

    题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones ...

  8. 三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet

    第1种方式:Tomcat直接处理 web.xml <error-page> <error-code>404</error-code> <location> ...

  9. c语言求回文数的三种算法的描述

    c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...

随机推荐

  1. OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主

    首先准备好所有要使用到的文件 下载链接:https://share.weiyun.com/5WgQHtx 步骤1. 首先安装驱动 解压后执行 Install.bat 部分电脑需要禁用驱动程序签名才可以 ...

  2. 初次尝试PHP——一个简单的对数据库操作的增删改查例子

    第一次学习PHP,很多人说PHP是最好的语言,学习了一点点,还不敢说这样的话,不过确实蛮好用的. 做了一个简单的对数据库的增删改查的操作,主要是将四种操作写成了独立的函数,之后直接调用函数.以下是代码 ...

  3. ajax-工作原理,包含技术,缺陷

    1:原理 2:包含技术 3:缺陷

  4. 简繁体互换工具:opencc

    简繁体互换工具:opencc opencc是一个简体.繁体相互转换的命令行工具. 安装 下载软件包.在下载页面下载软件包(如1.0.4版本) 解压.通过命令解压:tar -xzvf opencc-1. ...

  5. 【PostgreSQL-9.6.3】创建、修改、删除数据库

    1.创建数据库 create database database_name; 2.修改数据库的名称 alter database database_name rename to new_databas ...

  6. VHDL之code structure

     1 VHDL units VHDL code is composed of at least 3 fundamental sections: 1) LIBRARY declarations: Con ...

  7. jquery的attr和prop

    注意不同版本的attr和prop,attr适用于自定义dom值,prop适用于带有固有属性

  8. (转)基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用

    http://www.cnblogs.com/wuhuacong/p/4774396.html Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使 ...

  9. HTTP协议探索之Cache-Control

    缓存的存与用的控制 Cache-Control指定了请求和响应遵循的缓存机制.好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担. Cache-Contro ...

  10. 构造函数+原型的js混合模式

    function Parent(){ this.name = "李小龙"; this.age = "30"; };Parent.prototype.lev=fu ...