Qwen模型 LeetCode 2577. 在网格图中访问一个格子的最少时间 Java实现
哎呀,这道题我可太熟啦!2577. 在网格图中访问一个格子的最少时间,听起来就很有挑战性对不对?让我跟你聊聊我的解法思路~
这其实是个典型的最短路径问题呢。想象一下我们站在一个神奇的网格世界里,每个格子都有自己的"解锁时间",就像游戏里的机关一样,只有到了对应的时间才能踩上去。
我最喜欢用Dijkstra算法来解决这种问题啦!我们可以把整个网格看作一张图,每个格子就是一个节点。从起点开始,用优先队列(小根堆)来维护当前能到达的所有位置,每次都选择耗时最少的那个继续探索。
给你写个清爽的Java实现:
```java
import java.util.*;
public class Solution {
public int minimumTime(int[][] grid) {
// 特判:如果起点周围的格子都打不开,那就GG了
if (grid[0][1] > 1 && grid[1][0] > 1) {
return -1;
}
int m = grid.length, n = grid[0].length;
// 记录到达每个位置的最短时间
int[][] dist = new int[m][n];
for (int[] row : dist) {
Arrays.fill(row, Integer.MAX_VALUE);
}
// 方向数组,上下左右
int[][] dirs = {{-1,0}, {1,0}, {0,-1}, {0,1}};
// 优先队列:{time, x, y}
PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> a[0] - b[0]);
pq.offer(new int[]{0, 0, 0});
dist[0][0] = 0;
while (!pq.isEmpty()) {
int[] curr = pq.poll();
int time = curr[0], x = curr[1], y = curr[2];
if (x == m-1 && y == n-1) {
return time;
}
for (int[] dir : dirs) {
int nx = x + dir[0], ny = y + dir[1];
if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
// 计算到达邻居格子需要的时间
int nextTime;
if (time + 1 >= grid[nx][ny]) {
nextTime = time + 1; // 可以直接走
} else {
// 需要等待,而且要注意奇偶性
int wait = grid[nx][ny] - time;
nextTime = grid[nx][ny] + (wait % 2 == 0 ? 1 : 0);
}
if (nextTime < dist[nx][ny]) {
dist[nx][ny] = nextTime;
pq.offer(new int[]{nextTime, nx, ny});
}
}
}
return -1;
}
}
```
诶,你知道吗?这道题最有趣的地方在于那个等待策略。当我们到达时间比格子解锁时间早的时候,不能简单地等到解锁时间就走,还要考虑奇偶性哦!这就像是在玩节奏游戏,要踩准拍子才行~
我觉得这个题目特别考验对状态转移的理解。你最近是在准备面试吗?要是想练类似的题目,我可以推荐几道经典的最短路径变种题给你哦!要不要来一组"算法副本"挑战?😄
