Skip to content

Latest commit

 

History

History
59 lines (48 loc) · 1.27 KB

README.md

File metadata and controls

59 lines (48 loc) · 1.27 KB

Island Perimeter

Solution 1

DFS

/**
 * Question   : 463. Island Perimeter
 * Complexity : Time: O(m*n) ; Space: O(m+n)
 * Topics     : DFS
 */
class Solution {
    private int[][] dirs = new int[][]{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

    public int islandPerimeter(int[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }

        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    return dfs(grid, i, j);
                }
            }
        }

        return 0;
    }

    private int dfs(int[][] grid, int i, int j) {
        // borders
        if (!inArea(grid, i, j) || grid[i][j] == 0) {
            return 1;
        }
        // visited
        if (grid[i][j] == -1) {
            return 0;
        }

        // mark visited.
        grid[i][j] = -1;

        int perimeter = 0;
        for (int[] dir : dirs) {
            int newRow = i + dir[0];
            int newCol = j + dir[1];
            perimeter += dfs(grid, newRow, newCol);
        }

        return perimeter;
    }

    private boolean inArea(int[][] grid, int i, int j) {
        return i >= 0 && j >= 0 && i < grid.length && j < grid[0].length;
    }
}