LeetCode岛屿数量问题DFS解法出现运行错误,求代码问题排查
代码错误排查及修正方案
存在的问题
- 坐标偏移计算错误:代码中计算新列坐标
nj时错误使用了行偏移数组di,应该使用列偏移数组dj,导致所有方向遍历逻辑完全错误,无法正确访问上下左右相邻节点。 - 越界访问风险:
- DFS入口未先判断坐标
i、j是否合法,直接访问vis[i][j]和grid[i][j]会触发数组越界崩溃。 - 循环内
vis[ni][nj] = 1写在合法性判断外,若ni/nj越界会直接访问非法内存。
- DFS入口未先判断坐标
- 访问标记逻辑错误:
- 当前节点的访问标记
vis[i][j] = 1重复写在4次循环内,逻辑冗余,应该进入DFS后第一时间标记当前节点即可。 - 额外给
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
相关产品推荐
相关产品推荐

