778. Swim in Rising Water

这是一个找最短路径的问题,使用BFS2来解决。
一个点的cost,等于产生它的父亲的cost和它的height的最大值。
由于路径是递增关系,所以可以dedup at generation.
这是一个经典BFS2的应用。
从每个点expand它的邻居。每个点第一次被generate出来时一定是最优的。

class Solution {
    public int swimInWater(int[][] grid) {
        int[][] OFFSETS = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
        int N = grid.length;
        int M = grid[0].length;
            
        Queue queue = new PriorityQueue<>(Comparator.comparingInt(a -> a[2]));
        boolean[][] visited = new boolean[N][M];

        queue.offer(new int[]{0, 0, grid[0][0]});
        while (!queue.isEmpty()) {
            int[] t = queue.poll();
            if (t[0] == N - 1 && t[1] == M - 1) return t[2];
            int tDay = t[2];
            for (int[] os : OFFSETS) {
                int nr = os[0] + t[0], nc = os[1] + t[1];
                if (nr < 0 || nc < 0 || nr >= N || nc >= M) continue;
                if(visited[nr][nc]) continue; //dedup at generation
                visited[nr][nc] = true;
                queue.offer(new int[] {nr, nc, Math.max(tDay, grid[nr][nc])});
            }
        }
        return -1;
    }
}

你可能感兴趣的:(778. Swim in Rising Water)