10
private int countArea(int grid[][], int i, int j, int num) {11
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) return 0;13
if (grid[i][j] != 1) return 0;18
count += countArea(grid, i + d[0], j + d[1], num);24
private void fillDP(int grid[][], int dp[][], int i, int j, int count, int num) {25
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) return;27
if (grid[i][j] != num) return;29
if (dp[i][j] != 0) return;32
fillDP(grid, dp, i + d[0], j + d[1], count, num);36
public int largestIsland(int[][] grid) {37
int n = grid.length, m = grid[0].length;38
int dp[][] = new int[n][m];41
for (int i = 0; i < n; ++i) {42
for (int j = 0; j < m; ++j) {43
if (grid[i][j] == 1) {45
int count1 = countArea(grid, i, j, num);46
fillDP(grid, dp, i, j, count1, num);52
for (int i = 0; i < n; ++i) {53
for (int j = 0; j < m; ++j) {54
if (grid[i][j] != 0) continue;56
Set<Integer> set = new HashSet<>();58
int newRow = i + d[0];59
int newCol = j + d[1];61
if (newRow < 0 || newRow >= n || newCol < 0 || newCol >= m) continue;62
if (set.contains(grid[newRow][newCol])) continue;64
val += dp[newRow][newCol];65
set.add(grid[newRow][newCol]);67
max = Math.max(max, val);71
if (max == 0) return n * m;