问题描述
问题描述:https://leetcode.com/problems/number-of-islands/
基本上你有一个包含 1 和 0 的矩阵,你需要计算有多少组 1。
尽管有很多打印语句,但我无法弄清楚为什么这段代码不起作用。 我正在遍历矩阵,每当我看到一个 1 时,我都会进行深度优先搜索并将该 1 加上它周围的所有 1 变为 0 - 以将这些节点标记为已访问。
我错过了什么?
class Solution {
public int numIslands(char[][] grid) {
int count = 0;
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
//System.out.println(grid[i][j]);
if(grid[i][j] == '1') {
// System.out.println("i = " + i);
// System.out.println("j = " + j);
countIslands(grid,i,j);
count++;
}
}
}
return count;
}
public static void countIslands(char[][] grid,int sr,int sc) {
grid[sr][sc] = '0';
final int[][] SHIFTS = {
{0,1},//move right
{1,0},//move down
{0,-1},//move left
{-1,0} //move up
};
for(int[] shift : SHIFTS) {
sr = sr + shift[0];
sc = sc + shift[1];
if(moveValid(grid,sr,sc)) {
countIslands(grid,sc);
}
}
}
public static boolean moveValid(char[][] grid,int sc) {
if(sr >= 0 && sr < grid.length && sc >= 0 && sc < grid[sr].length && grid[sr][sc] == '1') {
return true;
}
return false;
}
}
解决方法
非常好的问题。在我看来,错误在于以下几行:
for(int[] shift : SHIFTS) {
sr = sr + shift[0];
sc = sc + shift[1];
if(moveValid(grid,sr,sc)) {
countIslands(grid,sc);
}
}
在这里,当您顺时针旋转时,不断增加 sr
和 sc
。因此,您的搜索将比您乍一看预期的更深入。
这部分代码有错误-
for(int[] shift : SHIFTS) {
sr = sr + shift[0];
sc = sc + shift[1];
if(moveValid(grid,sc)) {
countIslands(grid,sc);
}
}
您正在修改 sr、sc 并重新使用它来获取其他相邻字段。因此假设最初 sr=1,sc =1。与此相关的所有相邻单元格是 (1,0)、(2,1)、(0,1) 和 (1,2)。
但是在上面的代码中,相邻的单元格是这样构造的,首先是sr=1 sc=1 然后是sr=1 sc=2,所以进一步使用(1,2) 来获得相邻的单元格还包括 (1,3) 的单元格,而 (1,3) 不是 (1,1) 的相邻单元格。
正确的做法是-
for(int[] shift : SHIFTS) {
int nsr = sr + shift[0];
int nsc = sc + shift[1];
if(moveValid(grid,nsr,nsc)) {
countIslands(grid,nsc);
}
}