从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。某天集体村民决定将爱盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民,请问,此次分配土地,做出贡献的村民中最大会分配多大面积?
输入描述:
第一行输入m和n,m代表村子的土地的长,n代表土地的宽第二行开始输入地图上的县体标识
输出描述:
输出需要分配的土地面积,即包含相同数字旗子的最小矩阵中的最大面积
备注:
旗子上的数字为1-500,土地边长不超过500未插旗子的土地用0标识
示例1
输入
3 3
101
000
010
输出
9
代码
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();//土地的长
int n = in.nextInt();//土地的宽
int[][] matrix = new int[m][n];//记录土地插得旗子数字
in.nextLine();//吸收输入的换行符
Set<Integer> set = new HashSet<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = in.nextInt();
set.add(matrix[i][j]);
}
}
int sMax = 0;//最大土地面积
for(int i:set){
sMax = Math.max(sMax,findMax(matrix,i));
}
System.out.println(sMax);
}
public static int findMax(int[][] matrix,int td) {
if(td==0){//为零的不用计算
return 0;
}
int lMin=0;//旗子在数组中的最小列数
int mMin=0;//旗子在数组中的最小行数
int lMax=0;//旗子在数组中的最大列数
int mMax=0;//旗子在数组中的最大行数
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == td) {
lMin = Math.min(lMin, i);
mMin = Math.min(mMin, j);
lMax = Math.max(lMax, i);
mMax = Math.max(mMax, j);
}
}
}
return (lMax - lMin+1) * (mMax - mMin+1);
}
}
开始写的华为算法题,有些简单,火候还不到家,希望大佬给出建议与修改。