二进制矩阵最大面积矩形代码运行异常排查:maximalRectangle函数问题分析
二进制矩阵最大面积计算错误原因分析
看起来你已经把核心的直方图最大面积函数MAH()搞定了,问题全出在maximalRectangle()的实现细节上,我对比你和正确的代码,找出了三个关键错误:
1. 字符与整数的类型混淆
你的代码里直接把char类型的矩阵元素赋值给int数组:
b[j] = matrix[0][j];
但在Java中,char类型的'0'对应的ASCII值是48,'1'是49,不是你需要的数值0和1。这会导致第一行的直方图高度直接变成48或49,后续累加出来的数值完全偏离预期,计算的面积自然不可能正确。
正确的做法是把字符转换为逻辑值,比如判断是否为'1',再对应设置数值,就像示例代码那样:
if(matrix[i][j] == '1'){ arr[j]++; }else arr[j] = 0;
2. 第一行初始化逻辑错误
你单独处理第一行的方式不仅有上面的类型问题,还忽略了字符转数值的正确转换。示例代码的做法更简洁且正确:直接把第一行纳入循环,和后续行一样处理,避免单独初始化时出错。
3. 后续行的判断条件错误
你这里的判断完全不匹配数据类型:
if (matrix[i][j] == 0)
matrix是char[][]类型,元素是'0'/'1'字符,不是整数0,所以这个条件永远不会成立。不管当前位置是0还是1,你都会执行b[j] = b[j] + matrix[i][j],等于把错误的ASCII值继续累加,彻底破坏了直方图的构建逻辑。
修正后的maximalRectangle函数
把上面的问题都修复后,代码应该是这样:
public int maximalRectangle(char[][] matrix) { if (matrix == null || matrix.length == 0) return 0; int n = matrix.length; int m = matrix[0].length; int b[] = new int[m]; int maxArea = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { // 正确判断字符类型,并转换为逻辑高度 if (matrix[i][j] == '1') { b[j]++; } else { b[j] = 0; } } // 计算当前直方图的最大面积,并更新全局最大值 maxArea = Math.max(maxArea, MAH(b)); } return maxArea; }
这样就能和示例代码一样正确运行了,核心就是处理好char到逻辑数值的转换,以及判断条件的类型匹配。
内容的提问来源于stack exchange,提问作者nishchay007
相关产品推荐
相关产品推荐

