【问题标题】:Number of Islands iterating matrix and marking nodes as visited迭代矩阵和标记节点为已访问的岛数
【发布时间】:2021-04-24 08:43:58
【问题描述】:

问题描述:https://leetcode.com/problems/number-of-islands/

基本上你有一个1和0的矩阵,你需要计算有多少组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, sr, sc);
            }
        }
    }
    
    public static boolean moveValid(char[][] grid, int sr, int sc) {
        if(sr >= 0 && sr < grid.length && sc >= 0 && sc < grid[sr].length && grid[sr][sc] == '1') {
            return true;
        }
        return false;
    }
}

【问题讨论】:

标签: java recursion depth-first-search


【解决方案1】:

这部分代码有错误-

for(int[] shift : SHIFTS) {
        sr = sr + shift[0];
        sc = sc + shift[1];
        
        if(moveValid(grid, sr, sc)) {
            countIslands(grid, sr, 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,1) 的相邻单元格。

正确的做法是-

for(int[] shift : SHIFTS) {
        int nsr = sr + shift[0];
        int nsc = sc + shift[1];
        
        if(moveValid(grid, nsr, nsc)) {
            countIslands(grid, nsr, nsc);
        }
    }

【讨论】:

    【解决方案2】:

    非常好的问题。在我看来,错误在于以下几行:

    for(int[] shift : SHIFTS) {
        sr = sr + shift[0];
        sc = sc + shift[1];
        
        if(moveValid(grid, sr, sc)) {
            countIslands(grid, sr, sc);
        }
    }
    

    在这里,您在顺时针旋转时不断增加srsc。因此,您的搜索将比您乍一看更深入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多