题目描述
给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是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(n3),空间复杂度为O(n2)
输入描述:
第一行一个整数N。表示矩阵的长宽。
接下来N行,每行N个整数表示矩阵内的元素
输出描述:
输出一个整数表示答案
示例1
输入
5
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
输出
4
解法一:构建预处理矩阵遍历
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int len = Integer.parseInt(br.readLine());
int[][] arr = new int[len][len];
for(int i=0;i<len;i++){
String[] ss = br.readLine().trim().split(" ");
for(int j=0;j<len;j++){
arr[i][j] = Integer.parseInt(ss[j]);
}
}
int res = getRes(arr);
System.out.println(res);
}
public static int getRes(int[][] arr){
if(arr==null||arr.length==0) return 0;
int len = arr.length;
int[][] right = new int[len][len];
int[][] down = new int[len][len];
//构建快速查找数组
getMap(right,down,arr);
for(int size=len;size>0;size--){
if(hasSize(size,right,down)){
return size;
}
}
return 0;
}
public static boolean hasSize(int size,int[][] right,int[][] down){
for(int i=0;i<right.length-size+1;i++){
for(int j=0;j<right.length-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;
}
public static void getMap(int[][] right,int[][] down,int[][] arr){
int len = arr.length;
right[len-1][len-1] = arr[len-1][len-1]==1?1:0;
down[len-1][len-1] = arr[len-1][len-1]==1?1:0;
//处理最后一列
for(int i=len-2;i>=0;i--){
down[i][len-1] = arr[i][len-1]==1?1+down[i+1][len-1]:0;
right[i][len-1] = arr[i][len-1]==1?1:0;
}
//处理最后一行
for(int i=len-2;i>=0;i--){
right[len-1][i] = arr[len-1][i]==1?1+right[len-1][i+1]:0;
down[len-1][i] = arr[len-1][i]==1?1:0;
}
for(int i=len-2;i>=0;i--){
for(int j=len-2;j>=0;j--){
down[i][j] = arr[i][j]==1?1+down[i+1][j]:0;
right[i][j] = arr[i][j]==1?1+right[i][j+1]:0;
}
}
}
}