|
| 1 | +// https://leetcode.com/problems/number-of-islands |
| 2 | +// T: O(m * n) |
| 3 | +// T: O(m * n) |
| 4 | + |
| 5 | +public class NumberOfIslands { |
| 6 | + private static final char VISITED = '0'; |
| 7 | + private static final char ISLAND = '1'; |
| 8 | + |
| 9 | + public int numIslands(char[][] grid) { |
| 10 | + final int rows = grid.length, columns = grid[0].length; |
| 11 | + int islands = 0; |
| 12 | + |
| 13 | + for (int row = 0 ; row < rows ; row++) { |
| 14 | + for (int column = 0 ; column < columns ; column++) { |
| 15 | + if (isIsland(grid[row][column])) { |
| 16 | + islands++; |
| 17 | + markIslandAsSeen(grid, row, column); |
| 18 | + } |
| 19 | + } |
| 20 | + } |
| 21 | + |
| 22 | + return islands; |
| 23 | + } |
| 24 | + |
| 25 | + private boolean isIsland(char c) { |
| 26 | + return c == ISLAND; |
| 27 | + } |
| 28 | + |
| 29 | + private void markIslandAsSeen(char[][] grid, int row, int column) { |
| 30 | + if (!isValidPosition(grid, row, column) || !isIsland(grid[row][column])) return; |
| 31 | + markVisited(grid, row, column); |
| 32 | + markIslandAsSeen(grid, row - 1, column); |
| 33 | + markIslandAsSeen(grid, row, column + 1); |
| 34 | + markIslandAsSeen(grid, row + 1, column); |
| 35 | + markIslandAsSeen(grid, row, column - 1); |
| 36 | + } |
| 37 | + |
| 38 | + private boolean isValidPosition(char[][] grid, int row, int column) { |
| 39 | + return row >= 0 |
| 40 | + && row < grid.length |
| 41 | + && column >= 0 |
| 42 | + && column < grid[0].length; |
| 43 | + } |
| 44 | + |
| 45 | + private boolean alreadyVisited(char c) { |
| 46 | + return c == VISITED; |
| 47 | + } |
| 48 | + |
| 49 | + private void markVisited(char[][] grid, int row, int column) { |
| 50 | + grid[row][column] = VISITED; |
| 51 | + } |
| 52 | +} |
0 commit comments