你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。
一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。
请你返回从左上角走到右下角的最小 体力消耗值 。

输入:heights = [[1,2,2],[3,8,2],[5,3,5]]
输出:2
解释:路径 [1,3,5,3,5] 连续格子的差值绝对值最大为 2 。
这条路径比路径 [1,2,2,2,5] 更优,因为另一条路径差值最大值为 3 。
头一次做二分和BFS结合的题,适应一下…
class Solution {
int[] X = new int[]{0,-1,1,0};
int[] Y = new int[]{1,0,0,-1};
public int minimumEffortPath(int[][] heights) {
int l = 0,r = 1000000;
while(l < r){
int mid = (l+r)/2;
if(check(mid,heights)){
r = mid;
}else{
l = mid+1;
}
}
return r;
}
public boolean check(int mid,int[][] heights){
boolean[][] vis = new boolean[102][102];
Queue<A> q = new LinkedList<>();
q.offer(new A(0,0));
vis[0][0] = true;
while(!q.isEmpty()){
A top = q.poll();
int x = top.x;
int y = top.y;
if(x == heights.length-1 && y == heights[0].length-1){
return true;
}
for(int i = 0;i<4;i++){
int newX = x+X[i];
int newY = y+Y[i];
if(newX>=0 && newX<heights.length && newY>=0 && vis[newX][newY] == false && newY<heights[0].length && Math.abs(heights[x][y]-heights[newX][newY]) <= mid){
vis[newX][newY] = true;
q.offer(new A(newX,newY));
}
}
}
return false;
}
}
class A{
int x;
int y;
public A(int x,int y){
this.x = x;
this.y = y;
}
}
该博客讨论了一种混合算法,将广度优先搜索(BFS)与二分查找相结合来解决寻找从地图左上角到右下角的最小体力消耗路径的问题。题目中,体力值由相邻格子之间的高度差绝对值的最大值决定。博主通过创建一个二维数组记录已访问的节点,并使用队列进行BFS搜索,同时用二分查找优化搜索范围,最终找到了一条路径,其最大高度差不超过给定阈值。
426

被折叠的 条评论
为什么被折叠?



