Algorithm Leetcode:最大矩形
我正试图解决LeetCode的问题 我的实现分为两个阶段。 第一阶段构建一个表Algorithm Leetcode:最大矩形,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我正试图解决LeetCode的问题 我的实现分为两个阶段。 第一阶段构建一个表tabrec。 对于输入矩阵范围内的任意i和j 如果矩阵[i][j]='0',则选项卡[i][j]未定义,否则它会记录'1'在四个方向(左、右、上、下)的最大扩展。 在第二阶段,我通过遍历行和列来计算最大矩形。 对于每一行,我可以识别同一行中连续的1。 此外,我还可以找到包含前面构建的表的1行的最小矩形 这是密码 class Solution { struct Rect { int l;
tabrec
。
对于输入矩阵范围内的任意i和j
如果矩阵[i][j]='0'
,则选项卡[i][j]
未定义,否则它会记录'1'
在四个方向(左、右、上、下)的最大扩展。
在第二阶段,我通过遍历行和列来计算最大矩形。
对于每一行,我可以识别同一行中连续的1。
此外,我还可以找到包含前面构建的表的1行的最小矩形
这是密码
class Solution {
struct Rect {
int l;
int r;
int t;
int b;
};
public:
int maximalRectangle(vector<vector<char> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = matrix.size();
int col = 0;
if (row) col = matrix[0].size();
if (!(row && col)) return 0;
Rect *storage = new Rect[row * col];
Rect **rectab = new Rect*[row];
for (int i = 0; i < row; i++)
rectab[i] = storage + i * col;
// find the left most 1-extension for each point
for (int i = 0; i < row; i++) {
if (matrix[i][0] == '1') rectab[i][0].l = 0;
for (int j = 1; j < col; j++) {
if (matrix[i][j] == '1') {
if (matrix[i][j - 1] == '1')
rectab[i][j].l = rectab[i][j - 1].l;
else
rectab[i][j].l = j;
}
}
}
// find the right most 1-extension for each point
for (int i = 0; i < row; i++) {
if (matrix[i][col - 1] == '1') rectab[i][col - 1].r = col - 1;
for (int j = col - 2; j >= 0; j--) {
if (matrix[i][j] == '1') {
if (matrix[i][j + 1] == '1') rectab[i][j].r = rectab[i][j + 1].r;
else rectab[i][j].r = j;
}
}
}
// find the top most 1-extension for each point
for (int j = 0; j < col; j++) {
if (matrix[0][j] == '1') rectab[0][j].t = 0;
for (int i = 1; i < row; i++) {
if (matrix[i][j] == '1') {
if (matrix[i - 1][j] == '1') rectab[i][j].t = rectab[i - 1][j].t;
else rectab[i][j].t = i;
}
}
}
// find the bottom most 1-extension for each point
for (int j = 0; j < col; j++) {
if (matrix[row - 1][j] == '1') rectab[row - 1][j].b = row - 1;
for (int i = row - 2; i >= 0; i--) {
if (matrix[i][j] == '1') {
if (matrix[i + 1][j] == '1') rectab[i][j].b = rectab[i + 1][j].b;
else rectab[i][j].b = i;
}
}
}
int max = 0;
int i = 0;
int j = 0;
while (i < row) {
while (j < col && matrix[i][j] == '0') j++;
if (j < col) {
int el = rectab[i][j].l;
int er = rectab[i][j].r;
int et = rectab[i][j].t;
int eb = rectab[i][j].b;
j++;
while (j < col && matrix[i][j] == '1') {
Rect *rect = &rectab[i][j];
if (el < rect->l) el = rect->l;
if (er > rect->r) er = rect->r;
if (et < rect->t) et = rect->t;
if (eb > rect->b) eb = rect->b;
j++;
}
if (max < (er - el + 1) * (eb - et + 1))
max = (er - el + 1) * (eb - et + 1);
if (j == col) {
i++;
j = 0;
}
} else {
i++;
j = 0;
}
}
delete [] storage;
delete [] rectab;
return max;
}
};
类解决方案{
结构矩形{
int l;
INTR;
int t;
int b;
};
公众:
int最大矩形(向量和矩阵){
//开始在下面键入您的C/C++解决方案
//不要编写int main()函数
int行=矩阵.size();
int col=0;
如果(行)列=矩阵[0]。大小();
如果(!(行和列))返回0;
Rect*storage=new Rect[row*col];
Rect**rectab=新Rect*[行];
对于(int i=0;i=0;j--){
如果(矩阵[i][j]=='1'){
如果(矩阵[i][j+1]='1')rectab[i][j].r=rectab[i][j+1].r;
else-rectab[i][j].r=j;
}
}
}
//为每个点查找最顶部的1-延伸
对于(int j=0;j =0;i--){
如果(矩阵[i][j]=='1'){
如果(矩阵[i+1][j]='1')rectab[i][j].b=rectab[i+1][j].b;
else-rectab[i][j].b=i;
}
}
}
int max=0;
int i=0;
int j=0;
while(il)el=rect->l;
如果(er>rect->r)er=rect->r;
如果(ett)et=rect->t;
如果(eb>rect->b)eb=rect->b;
j++;
}
如果(最大值<(er-el+1)*(eb-et+1))
最大值=(er-el+1)*(eb-et+1);
if(j==col){
i++;
j=0;
}
}否则{
i++;
j=0;
}
}
删除[]存储;
删除[]rectab;
返回最大值;
}
};
此实现可以通过小数据集测试,而在大数据集中有4例失败
我想不出这个问题。
我的算法有什么问题(我认为它是对的)或者我的实现中有什么缺陷吗?您的算法中有一个缺陷:
while (j < col && matrix[i][j] == '1') {
Rect *rect = &rectab[i][j];
if (el < rect->l) el = rect->l;
if (er > rect->r) er = rect->r;
if (et < rect->t) et = rect->t;
if (eb > rect->b) eb = rect->b;
j++;
}
if (max < (er - el + 1) * (eb - et + 1))
max = (er - el + 1) * (eb - et + 1);
答案应该是6,但您的算法将返回4
即使有上述改变,它仍然是不正确的。实际上,这个问题最好用DP来解决。搜索最大2d数组和以供参考。谢谢您的回答。“搜索最大的2d阵列以供参考”,您能详细说明一下吗?简单的最大和策略当然不起作用,例如,在您的示例中,总区域的和不小于任何子2d数组。再次感谢。:)@Summer_More_More_Tea您可以使用一个基于朴素最大和算法的小技巧:如果矩阵[i][j]=0,将其设置为-MAX_INT,如果矩阵[i][j]=1,则不更改。然后您可以直接应用最大和算法。
0 1 1 1 1
1 1 1 1 0