As Far from Land as Possible

1 minute read

1162. As Far from Land as Possible

BFS

Python

class Solution:
    def maxDistance(self, grid: List[List[int]]) -> int:
        
        N = len(grid)
        q = collections.deque()
        
        def get_neighbors(x, y):
            ret = []
            for xx, yy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
                if 0 <= x + xx < N and 0 <= y + yy < N:
                    ret.append((x + xx, y + yy))
            return ret
            
        for i in range(N):
            for j in range(N):
                if grid[i][j] == 1:
                    for ii, jj in get_neighbors(i, j):
                        if grid[ii][jj] == 0:
                            q.append((ii, jj, 1))
        
        ret = -1        
        while q:
            i, j, dist = q.popleft()
            if grid[i][j] != 0:
                continue
            grid[i][j] = dist
            ret = max(ret, dist)
            
            for ii, jj in get_neighbors(i, j):
                q.append((ii, jj, dist+1))
                
        return ret
            

Java

class Solution {
    int gridSize;
    public int maxDistance(int[][] grid) {
        
        this.gridSize = grid.length;
        
        Queue<Triplet> q = new ArrayDeque<Triplet>();
            
        for (int i = 0; i < gridSize; ++i) {
            for (int j = 0; j < gridSize; ++j) {
                if (grid[i][j] == 1) {
                    for (List<Integer> l: this.getNeighbors(i, j)) {
                        q.add(new Triplet(l.get(0), l.get(1), 1));
                    }
                }
            }
        }
        int ret = -1;
        while (!q.isEmpty()) {
            Triplet t = q.remove();
            int i = t.arr[0], j = t.arr[1], dist = t.arr[2];
            if (grid[i][j] != 0) continue;
            grid[i][j] = dist;
            for (List<Integer> tmp: this.getNeighbors(i, j)) {
                q.add(new Triplet(tmp.get(0), tmp.get(1), dist + 1));
                ret = Math.max(ret, dist);
            }
        }
        
        return ret;
        
    }
    private List<List<Integer>> getNeighbors(int i, int j) {
        List<List<Integer>> ret = new ArrayList<>();
        if (i + 1 < gridSize)
            ret.add(Arrays.asList(i+1, j));
        if (i - 1 >= 0)
            ret.add(Arrays.asList(i-1, j));
        if (j + 1 < gridSize)
            ret.add(Arrays.asList(i, j+1));
        if (j - 1 >= 0)
            ret.add(Arrays.asList(i, j-1));
        return ret;
    }
}

class Triplet {
    public int[] arr;
    public Triplet(int a, int b, int c) {
        arr = new int[]{a, b, c};
    }
}

Comments