Problem : https://leetcode.com/problems/as-far-from-land-as-possible/description/
Start from all the land cells and use BFS approach to calculate Manhattan distance for each water cells.
Manhattan distance means on each step, we can move to the 4 conjunctive cells ( up, down, left, right ).
Because of memorization, each cell will only be visited once.
Time complexity : O ( M * N ), M = len(grid), N = len(grid[0])
class Solution {
static final int[][] diffs = new int[][] { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
public int maxDistance(int[][] grid) {
int ROW = grid.length;
int COLUMN = grid[0].length;
int[][] memo = new int[ROW][COLUMN];
Deque<int[]> queue = new LinkedList<>();
for (int y = 0; y < ROW; y++) {
for (int x = 0; x < COLUMN; x++) {
if (grid[y][x] == 1)
queue.offerLast(new int[] {y, x});
}
}
int result = -1;
int step = 1;
while (!queue.isEmpty()) {
int n = queue.size();
for (int i = 0; i < n; i++) {
int[] cur = queue.pollFirst();
int cy = cur[0], cx = cur[1];
for (int[] d : diffs) {
int ny = cy + d[0], nx = cx + d[1];
if (0 <= ny && ny < ROW &&
0 <= nx && nx < COLUMN &&
grid[ny][nx] == 0 &&
(memo[ny][nx] == 0 || memo[ny][nx] > step)) {
memo[ny][nx] = step;
queue.offerLast(new int[] {ny, nx});
}
}
}
if (!queue.isEmpty()) {
result = Math.max(result, step);
}
step += 1;
}
return result;
}
}
No comments:
Post a Comment