778. Swim in Rising Water
Solution
PriotiyQueue
由(0,0)開始進行4個方向進行traverse,並用priotiyQueue紀錄所visit的grid的elevation,然後由低海拔開始優先進行traverse開發到高的海拔並紀錄max值。 當到達(N-1, N-1)時就可以知道到達該點所遇到的最高海拔是多少。
因為透過priotiyQueue優先由低海拔的開始。所以第一次到達(N-1,N-1)一定是最小的case。
public int swimInWater(int[][] grid) {
int N = grid.length;
PriorityQueue<int[]> pq = new PriorityQueue<>((a,b)-> a[2]-b[2]);
boolean[][] isVisited = new boolean[N][N];
int maxElevation = 0;
pq.add(new int[]{0, 0, grid[0][0]});
isVisited[0][0] = true;
int[][] dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};
while(!pq.isEmpty()){
int[] point = pq.poll();
maxElevation = Math.max(maxElevation, point[2]);
isVisited[point[0]][point[1]] = true;
for(int[] dir : dirs){
int newI = point[0] + dir[0];
int newJ = point[1] + dir[1];
if(newI >= 0 && newI < N && newJ >= 0 && newJ < N && !isVisited[newI][newJ]){
if(newI == N-1 && newJ == N-1){
return Math.max(maxElevation, grid[newI][newJ]);
}
pq.offer(new int[]{newI, newJ, grid[newI][newJ]});
}
}
}
return 0;
}
Last updated
Was this helpful?