827. 最大人工岛
给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。
返回执行此操作后,grid 中最大的岛屿面积是多少?
岛屿 由一组上、下、左、右四个方向相连的 1 形成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/making-a-large-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class Solution {
private int[][] directions = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
private int dfs(int[][] grid, int x, int y, int number) {
int ans = 1;
grid[x][y] = number;
for (int i = 0; i < directions.length; ++i) {
int nx = x + directions[i][0];
int ny = y + directions[i][1];
if (nx >= 0 && nx < grid.length && ny >= 0 && ny < grid[0].length && grid[nx][ny] == 1) {
ans += dfs(grid, nx, ny, number);
}
}
return ans;
}
public int largestIsland(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int ans = 0;
int number = 2;
Map<Integer, Integer> numMap = new HashMap<>();
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j] == 1) {
int num = dfs(grid, i, j, number);
ans = Math.max(ans, num);
numMap.put(number++, num);
}
}
}
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j] == 0) {
Set<Integer> set = new HashSet<Integer>() {{
add(0);
}};
int num = 1;
for (int k = 0; k < directions.length; ++k) {
int x = i + directions[k][0];
int y = j + directions[k][1];
if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length && !set.contains(grid[x][y])) {
set.add(grid[x][y]);
num += numMap.get(grid[x][y]);
}
}
ans = Math.max(ans, num);
}
}
}
return ans;
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号