https://blog.youkuaiyun.com/give_me_energy/article/details/51006708
【题目】
给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
此问题主要是求一个数组的最大连续相同字符的正方形的问题,比如
0 1 1 1 1 1
0 1 1 1 1 1
1 1 1 1 1 1
0 0 0 0 0 0
得出来得的是
输出边长也就是3
【思路】
先从a[1][1]开始,循环至结尾,每一次都执行以下循环体:
比较a[]i-1[j-1],a[i][j-1],a[i-1][j],选出最小的,然后加到a[i][j]里,判断全局变量的max是否小于a[i][j],如果是的话,赋值。
【代码】
public static void main(String[] args) {
int[][] arr=new int[4][6];
arr[0]=new int[]{0,1,1,1,1,1};
arr[1]=new int[]{0,1,1,1,1,1};
arr[2]=new int[]{1,1,1,1,1,1};
arr[3]=new int[]{0,0,0,0,0,0};
System.out.println(sideLenth(arr));//3
}
// 求最大边长的函数
private static int sideLenth(int[][] arr) {
if(arr==null||arr.length==0||arr[0].length==0){
return 0;
}
int max=-1;
int min=0;
for(int i=1;i<arr.length;i++){
for(int j=1;j<arr[0].length;j++){
min=Math.min(Math.min(arr[i-1][j-1],
arr[i-1][j]),arr[i][j-1]);
//左边、右边、左斜上最小的数,加到arr[i][j]
arr[i][j]+=min;
if(max<arr[i][j]){
max=arr[i][j];
}
}
}
return max;
}
312

被折叠的 条评论
为什么被折叠?



