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

LeetCode 827 Making A Large Island Java代码错误原因排查求助

代码问题排查

核心错误原因

重复使用未重置的visited数组导致面积统计遗漏

  • 你在largestIsland方法开头仅初始化了一次visited数组,遍历每一个0并临时改为1计算岛屿面积时,全程复用同一个visited数组。第一次计算后所有访问过的1的位置都会被标记为true,后续计算其他位置的岛屿面积时,这些已经被标记的1不会被重复统计,最终得到的面积比实际值小。

对应你报错的测试用例[[1,1,0],[0,0,0], [1,1,0]]:当遍历到坐标(1,1)的0并改为1时,理论上可以连通上方2个1、下方2个1加上自己总共5的面积,但因为之前计算其他位置的面积时已经把(0,0)、(0,1)标记为已访问,本次统计时这两个位置不会被计入,最终得到错误的3。


逻辑修复方案

把visited数组的初始化放到每次计算面积之前即可,修改后代码如下:

class Solution {
    public int largestIsland(int[][] grid) {
        int n=grid.length;
        int max=0;
        boolean hasZero=false;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==0){
                    grid[i][j]=1;
                    // 每次计算前新建空白的visited数组,避免之前的标记影响当前统计
                    boolean[][] visited = new boolean[n][n];
                    max=Math.max(max,area(grid,n,i,j,visited));  
                    grid[i][j]=0;
                    hasZero=true;
                }
            }
        }
        
        return hasZero?max:n*n;
    }
    
    private int area(int[][] grid, int n, int i, int j, boolean[][] visited){
        if(i<0 || i>n-1 || j>n-1 || j<0 || grid[i][j]==0 || visited[i][j])
            return 0;
        
        visited[i][j]=true;
        int a1 =  area(grid,n,i+1,j,visited);
        int a2 =  area(grid,n,i,j+1,visited);
        int a3 = area(grid,n,i-1,j,visited);
        int a4 =  area(grid,n,i,j-1,visited);
            
        return 1+a1+a2+a3+a4;
    }
}

注:修改后仅修复逻辑正确性,时间复杂度仍然为O(N^4),仅适用于小数据量场景,大数据量测试用例会超时。

内容的提问来源于stack exchange,提问作者nanosoft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:30:01