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

LeetCode岛屿数量问题DFS解法出现运行错误,求代码问题排查

代码错误排查及修正方案

存在的问题

  • 坐标偏移计算错误:代码中计算新列坐标nj时错误使用了行偏移数组di,应该使用列偏移数组dj,导致所有方向遍历逻辑完全错误,无法正确访问上下左右相邻节点。
  • 越界访问风险:
    1. DFS入口未先判断坐标i、j是否合法,直接访问vis[i][j]和grid[i][j]会触发数组越界崩溃。
    2. 循环内vis[ni][nj] = 1写在合法性判断外,若ni/nj越界会直接访问非法内存。
  • 访问标记逻辑错误:
    1. 当前节点的访问标记vis[i][j] = 1重复写在4次循环内,逻辑冗余,应该进入DFS后第一时间标记当前节点即可。
    2. 额外给vis[ni][nj]赋值1的逻辑完全多余,岛屿遍历不需要回溯标记,只要访问过的节点标记一次即可,错误的标记会导致部分节点未被正确遍历。

修正后的代码

void dfs( vector<vector<int>> &vis,vector<vector<char>>& grid,int di[],int dj[],int i,int j,int n,int m)
{
    // 先判断坐标合法性,再判断是否已访问或者是水域
    if(i<0 || j<0 || i>=n || j>=m || vis[i][j]==1 || grid[i][j]=='0')
        return;
    // 进入即标记当前节点已访问
    vis[i][j] = 1;
    for(int ind=0;ind<4;ind++)
    {
        int ni=i+di[ind];
        // 修正nj的计算,使用dj数组
        int nj=j+dj[ind];
        dfs(vis,grid,di,dj,ni,nj,n,m);
    } 
}

int numIslands(vector<vector<char>>& grid) {
    int n=grid.size();
    if(n == 0) return 0;
    int c=0;
    int m=grid[0].size();
    vector<vector<int>> vis(n,vector<int>(m,0));
    int di[4]={-1,0,0,1};
    int dj[4]={0,1,-1,0};
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {        
            if(grid[i][j]=='1' && !vis[i][j])
            {   
                dfs(vis,grid,di,dj,i,j,n,m);
                c++;
            }
        }
    }
    return c;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:54:03