Given a non-empty 2D arraygridof 0‘s and 1‘s, anislandis a group of1‘s (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.Find the maximum area of
Given a non-empty 2D array grid of 0‘s and 1‘s, an island is a group of 1‘s (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water. Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.) Example 1:? [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] Given the above grid, return 6. Note the answer is not 11, because the island must be connected 4-directionally. Example 2:? [[0,0,0,0,0,0,0,0]] Given the above grid, return 0. // correct class Solution { private static final int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; public int maxAreaOfIsland(int[][] grid) { int res = 0; for(int i = 0; i < grid.length; i++){ for(int j = 0; j < grid[0].length; j++){ if(grid[i][j] == 1){ int[] area = new int[1]; dfs(i, j, area, grid); res = Math.max(res, area[0]); } } } return res; } private void dfs(int i, int j, int[] area, int[][] grid){ // base case if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0) return; // mark it after visiting grid[i][j] = 0; area[0]++; for(int[] dir : dirs){ int x = i + dir[0]; int y = j + dir[1]; dfs(x, y, area, grid); } } } // idk why it’s wrong // grid[i][j] = 0; // // base case : // // out of bound or 0 // area[0]++; // for(int[] dir : dirs){ // int x = i + dir[0]; // int y = j + dir[1]; // if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0) continue; // dfs(x, y, area, grid); // } // } // } // wrong , my code, area should be int[] as a parameter , not int, because in java , pass by reference .. class Solution { private static final int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; public int maxAreaOfIsland(int[][] grid) { int res = 0; for(int i = 0; i < grid.length; i++){ for(int j = 0; j < grid[0].length; j++){ if(grid[i][j] == 1){ int area = 0; dfs(i, j, area, grid); res = Math.max(res, area); } } } return res; } private void dfs(int i, int j, int area, int[][] grid){ grid[i][j] = 0; // base case : // out of bound or 0 area++; for(int[] dir : dirs){ int x = i + dir[0]; int y = j + dir[1]; if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0) continue; dfs(x, y, area, grid); } } } // correct , other’s code public int maxAreaOfIsland(int[][] grid) { if (grid == null || grid.length == 0) { return 0; } int m = grid.length; int n = grid[0].length; int max = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid[i][j] == 1) { int area = dfs(grid, i, j, m, n, 0); max = Math.max(area, max); } } } return max; } int dfs(int[][] grid, int i, int j, int m, int n, int area) { if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0) { return area; } grid[i][j] = 0; area++; area = dfs(grid, i + 1, j, m, n, area); area = dfs(grid, i, j + 1, m, n, area); area = dfs(grid, i - 1, j, m, n, area); area = dfs(grid, i, j - 1, m, n, area); return area; }