Maximal Rectangle [leetcode] 的三种思路
第一种方法是利用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] 的三种思路的更多相关文章
- 简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...
- Reorder List [leetcode] 这两种思路
第一个想法随着vector保存全部Node* 表拼接出来 void reorderList(ListNode *head) { vector<ListNode*> content; Lis ...
- Java中实现十进制数转换为二进制的三种思路
Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...
- Jump Game 的三种思路 - leetcode 55. Jump Game
Jump Game 是一道有意思的题目.题意很简单,给你一个数组,数组的每个元素表示你能前进的最大步数,最开始时你在第一个元素所在的位置,之后你可以前进,问能不能到达最后一个元素位置. 比如: A = ...
- JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...
- Maximal Rectangle [LeetCode]
Problem Description: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle co ...
- Maximal Rectangle leetcode java
题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones ...
- 三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet
第1种方式:Tomcat直接处理 web.xml <error-page> <error-code>404</error-code> <location> ...
- c语言求回文数的三种算法的描述
c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...
随机推荐
- OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
首先准备好所有要使用到的文件 下载链接:https://share.weiyun.com/5WgQHtx 步骤1. 首先安装驱动 解压后执行 Install.bat 部分电脑需要禁用驱动程序签名才可以 ...
- 初次尝试PHP——一个简单的对数据库操作的增删改查例子
第一次学习PHP,很多人说PHP是最好的语言,学习了一点点,还不敢说这样的话,不过确实蛮好用的. 做了一个简单的对数据库的增删改查的操作,主要是将四种操作写成了独立的函数,之后直接调用函数.以下是代码 ...
- ajax-工作原理,包含技术,缺陷
1:原理 2:包含技术 3:缺陷
- 简繁体互换工具:opencc
简繁体互换工具:opencc opencc是一个简体.繁体相互转换的命令行工具. 安装 下载软件包.在下载页面下载软件包(如1.0.4版本) 解压.通过命令解压:tar -xzvf opencc-1. ...
- 【PostgreSQL-9.6.3】创建、修改、删除数据库
1.创建数据库 create database database_name; 2.修改数据库的名称 alter database database_name rename to new_databas ...
- VHDL之code structure
1 VHDL units VHDL code is composed of at least 3 fundamental sections: 1) LIBRARY declarations: Con ...
- jquery的attr和prop
注意不同版本的attr和prop,attr适用于自定义dom值,prop适用于带有固有属性
- (转)基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用
http://www.cnblogs.com/wuhuacong/p/4774396.html Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使 ...
- HTTP协议探索之Cache-Control
缓存的存与用的控制 Cache-Control指定了请求和响应遵循的缓存机制.好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担. Cache-Contro ...
- 构造函数+原型的js混合模式
function Parent(){ this.name = "李小龙"; this.age = "30"; };Parent.prototype.lev=fu ...