Java 给你一个 R 行 C 列的整数矩阵 A。矩阵上的路径从 00 开始在 R-1C-1 结束。路径沿四个基本方向上、下、左、右展开从一个已访问单元格移动到任一相邻的未访问单元格。路径的得分是该路径上的 最小 值。例如路径 8 → 4 → 5 → 9 的值为 4 。找出所有路径中得分 最高 的那条路径返回其 得分。
思路:使用动态规划,从左上角开始遍历整个矩阵,对于每个位置,计算出从起点到该位置的最小值,同时记录最大值。最后返回最大值即可。
代码实现:
class Solution { public int maximumMinimumPath(int[][] A) { int row = A.length; int col = A[0].length; int[][] dp = new int[row][col]; // dp[i][j]表示从起点到(i,j)的最小值 dp[0][0] = A[0][0]; int max = dp[0][0]; // 记录最大值 int[][] directions = {{0,1},{0,-1},{1,0},{-1,0}}; // 四个方向 PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> b[2] - a[2]); // 最大堆,按照路径最小值排序 pq.offer(new int[]{0,0,A[0][0]}); while(!pq.isEmpty()){ int[] curr = pq.poll(); int x = curr[0]; int y = curr[1]; int min = curr[2]; if(x == row-1 && y == col-1) return max; // 到达终点,返回最大值 for(int[] dir : directions){ int newX = x + dir[0]; int newY = y + dir[1]; if(newX >= 0 && newX < row && newY >= 0 && newY < col && dp[newX][newY] == 0){ dp[newX][newY] = Math.min(min, A[newX][newY]); // 更新最小值 max = Math.max(max, dp[newX][newY]); // 更新最大值 pq.offer(new int[]{newX,newY,dp[newX][newY]}); } } } return -1; // 不可能到达终点 }
原文地址: https://www.cveoy.top/t/topic/fJmb 著作权归作者所有。请勿转载和采集!