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 ...
随机推荐
- 【Python】循环语句
while循环 当条件成立时,循环体的内容可以一直执行,但是避免死循环,需要有一个跳出循环的条件才行. for循环 遍历任何序列(列表和字符串)中的每一个元素 >>> a = [&q ...
- java 关键字与保留字
Java 关键字列表 (依字母排序 共51组),所有的关键字都是小写,在MyEclipse中都会显示不同的颜色: abstract, assert,boolean, break, byte, case ...
- tomcat启动时出现以前删除的项目,导致无法启动
com.sun.faces.config.ConfigureListener contextInitialized 解决: 进入到你自己的tomcat安装目录:C:\Program Files\Apa ...
- 【Leetcode】376. Wiggle Subsequence
Description: A sequence of numbers is called a wiggle sequence if the differences between successive ...
- Jquery 获取父页面下指定iframe里的指定元素
var div1=$("#iframe1",window.parent.document).contents().find("#div1");
- css样式变 及实际用法
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...
- Arduino DS18B20温度检测
一.实物图 注:电阻选取4.7k欧 二.事例代码 注:先下载Onewire库到arduino libraries目录下,然后就有例子 #include <OneWire.h> // One ...
- Ad hoc polymorphism
与面向对象中的接口类或抽象类中定义的函数组类似: 函数的具体执行依赖与函数医用的类型. In programming languages, ad-hoc polymorphism[1] is a ki ...
- js与Jquery的对比
// document.getElementById("divCommit").style.display="none";// document.g ...
- Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar
正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...