diff --git a/src/main/java/com/dota/gridGraph/_1765/Solution.java b/src/main/java/com/dota/gridGraph/_1765/Solution.java new file mode 100644 index 0000000..d88ebbe --- /dev/null +++ b/src/main/java/com/dota/gridGraph/_1765/Solution.java @@ -0,0 +1,37 @@ +package com.dota.gridGraph._1765; + +import java.util.ArrayDeque; + +class Solution { + public int[][] highestPeak(int[][] isWater) { + int n = isWater.length; + int m = isWater[0].length; + var queue = new ArrayDeque(); + var book = new boolean[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (isWater[i][j] == 1) { + queue.add(new int[]{i, j}); + isWater[i][j] = 0; + book[i][j] = true; + } + } + } + var next = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; + while (!queue.isEmpty()) { + var xy = queue.poll(); + int x = xy[0]; + int y = xy[1]; + for (int[] ints : next) { + int nextX = x + ints[0]; + int nextY = y + ints[1]; + if (nextX < 0 || nextY < 0 || nextX >= n || nextY >= m || book[nextX][nextY]) continue; + isWater[nextX][nextY] = isWater[x][y] + 1; + book[nextX][nextY] = true; + queue.offer(new int[]{nextX, nextY}); + } + } + + return isWater; + } +} \ No newline at end of file diff --git a/src/main/java/com/dota/gridGraph/_827/Solution.java b/src/main/java/com/dota/gridGraph/_827/Solution.java new file mode 100644 index 0000000..03fc732 --- /dev/null +++ b/src/main/java/com/dota/gridGraph/_827/Solution.java @@ -0,0 +1,77 @@ +package com.dota.gridGraph._827; + +import java.util.HashMap; +import java.util.HashSet; + +class Solution { + public int largestIsland(int[][] grid) { + int res = 0; + var map = new HashMap(); + var idx = 2; + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[0].length; j++) { + if (grid[i][j] == 1) { + goin(i, j, grid, idx, map); + idx++; + } + } + } + + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[0].length; j++) { + if (grid[i][j] == 0) { + int sum = df(i, j, grid, map); + res = Math.max(res, sum); + } + } + } + int n = grid.length; + return res==0?n*n:res; + } + + void goin(int i, int j, int[][] grid, int idx, HashMap map) { + if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != 1) return; + grid[i][j] = idx; + map.merge(idx, 1, Integer::sum); + goin(i - 1, j, grid, idx, map); + goin(i + 1, j, grid, idx, map); + goin(i, j - 1, grid, idx, map); + goin(i, j + 1, grid, idx, map); + } + + int df(int i, int j, int[][] grid, HashMap map) { + var set = new HashSet(); + int sum = 1; + int t = dfs(i - 1, j, grid, map); + if (t > 0) { + sum += t; + set.add(grid[i - 1][j]); + } + + t = dfs(i + 1, j, grid, map); + if (t > 0 && !set.contains(grid[i + 1][j])) { + sum += t; + set.add(grid[i + 1][j]); + } + + t = dfs(i, j - 1, grid, map); + if (t > 0 && !set.contains(grid[i][j - 1])) { + sum += t; + set.add(grid[i][j - 1]); + } + t = dfs(i, j + 1, grid, map); + if (t > 0 && !set.contains(grid[i][j + 1])) { + sum += t; + set.add(grid[i][j + 1]); + } + return sum; + } + + int dfs(int i, int j, int[][] grid, HashMap map) { + if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0) { + return 0; + } + + return map.get(grid[i][j]); + } +} \ No newline at end of file