
哎呀这道题我可太熟啦2577. 在网格图中访问一个格子的最少时间听起来就很有挑战性对不对让我跟你聊聊我的解法思路~这其实是个典型的最短路径问题呢。想象一下我们站在一个神奇的网格世界里每个格子都有自己的解锁时间就像游戏里的机关一样只有到了对应的时间才能踩上去。我最喜欢用Dijkstra算法来解决这种问题啦我们可以把整个网格看作一张图每个格子就是一个节点。从起点开始用优先队列小根堆来维护当前能到达的所有位置每次都选择耗时最少的那个继续探索。给你写个清爽的Java实现javaimport 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}PriorityQueueint[] 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;}}诶你知道吗这道题最有趣的地方在于那个等待策略。当我们到达时间比格子解锁时间早的时候不能简单地等到解锁时间就走还要考虑奇偶性哦这就像是在玩节奏游戏要踩准拍子才行~我觉得这个题目特别考验对状态转移的理解。你最近是在准备面试吗要是想练类似的题目我可以推荐几道经典的最短路径变种题给你哦要不要来一组算法副本挑战