你准备参加一场远足活动。给你一个二维 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;
}
}