文章目录
边界都是1的最大正方形大小
题目
给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回最大正方形的边长长度。
如:
0 1 1 1 1
0 1 0 0 1
0 1 0 0 1
0 1 1 1 1
0 1 0 1 1
其中边框全是1的最大正方形大小为4×4,返回4
代码
逐个位置判断复杂度可以达到O(N4),经过更改后的复杂度可以达到O(N3)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void setBorderMap(vector<vector<int>> &m, vector<vector<int>> &right, vector<vector<int>> &down)
{
int row = m.size();
int col = m[0].size();
if (m[row - 1][col - 1] == 1)
{
right[row - 1][col - 1] = 1;
down[row - 1][col - 1] = 1;
}
for (int i = row - 2; i >= 0; i--)
{
if (m[i][col - 1] == 1)
{
right[i][col - 1] = 1;
down[i][col - 1] = down[i + 1][col - 1] + 1;
}
}
for (int i = col - 2; i >= 0; i--)
{
if (m[row - 1][i] == 1)
{
right[row - 1][i] = right[row - 1][i + 1] + 1;
down[row - 1][i] = 1;
}
}
for (int i = row - 2; i >= 0; i--)
{
for (int j = col - 2; j >= 0; j--)
{
if (m[i][j] == 1)
{
right[i][j] = right[i][j + 1] + 1;
down[i][j] = down[i + 1][j] + 1;
}
}
}
}
bool hasSizeofBorder(int size, vector<vector<int>> right, vector<vector<int>> down)
{
for (int i = 0; i < right.size() - size + 1; i++)
{
for (int j = 0; j < right[0].size() - size + 1; j++)
{
if (right[i][j] >= size && down[i][j] >= size && right[i + size - 1][j] >= size && down[i][j + size - 1] >= size)
return true;
}
}
return false;
}
int getMaxSize(vector<vector<int>> m)
{
int row = m.size();
int col = m[0].size();
vector<vector<int>>right(row, vector<int>(col, 0));
vector<vector<int>>down(row, vector<