You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二进制矩阵最大面积矩形代码运行异常排查: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:43:13