463. 岛屿的周长


深度优先搜索

class Solution {

    int m;
    int n;
    boolean[][] used;
    int sum = 0;
    int[][] move = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

    public int islandPerimeter(int[][] grid) {

        m = grid.length;
        n = grid[0].length;
        used = new boolean[m][n];

        for (int i = 0; i < m; i++) {

            for (int j = 0; j < n; j++) {

                /**
                 * 只会存在一个岛屿,因此只要找到1就可以终止这个循环
                 */
                if (grid[i][j] == 1) {

                    dfs(grid, i, j);
                    break;
                }
            }
        }

        return sum;
    }

    public void dfs(int[][] grid, int row, int col) {

        /**
         * 如果该数字已被使用过,就停止搜索
         */
        if (used[row][col]) {
            return;
        }

        for (int i = 0; i < 4; i++) {

            used[row][col] = true;
            int newRow = row + move[i][0];
            int newCol = col + move[i][1];

            /**
             * 当下一个元素的索引越界或者值是0时,那条边就是边缘,就记录下次数
             * 否则就可以正常搜索
             */
            if (newRow < 0 || newRow >= m || newCol < 0 || newCol >= n || grid[newRow][newCol] == 0){
                sum++;
            }
            else {
                dfs(grid, newRow, newCol);
            }
        }
    }
}

/**
 * 时间复杂度 O(m×n)
 * 空间复杂度 O(m×n)
 */

https://leetcode-cn.com/problems/island-perimeter/