题解
二分 + dfs
题目中给出的 <=1heights[i][j]的取值范围 =<10000000 那么最大值为99999,最小值为0,那么就可以-二分,从中间开始查找这个最大值是否可以走到右下角,如果可以那么继续二分搜索最小的最大值。
dfs 深度搜索是否有一条路径可以到达右下角,并且两个距离之间的差的绝对值 <= mid
代码
class Solution {
public:
bool dfs(vector<vector<int>>& heights,vector<vector<bool>>& sign, int& mid,int x,int y){
if(x == sign.size() -1 && y == sign[0].size()-1){//说明已经到达了右下角,返回即可
return true;
}
sign[x][y] = true;
//四个方向
for(int i = 0; i < 4; i++){
int cur_x = x + step[i][0];
int cur_y = y + step[i][1];
if(cur_x >= 0 && cur_x < sign.size() && cur_y >= 0 &&cur_y < sign[0].size()&&!sign[cur_x][cur_y]&& (abs(heights[x][y] - heights[cur_x][cur_y]) <= mid))
if(dfs(heights,sign,mid,cur_x,cur_y)){
return true;
}
}
return false;
}
const int step[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};//上下左右四个坐标
int minimumEffortPath(vector<vector<int>>& heights) {
int left = 0;
int right = 9999999;
while(left < right){
//标记访问过的路径
vector<vector<bool>> sign(heights.size(),vector<bool>(heights[0].size(),false));
//当前体力值的中间值
int mid = left + (right - left)/2;
if(dfs(heights,sign,mid,0,0)){//判断当前直下是否可以达到右下角//如果可以到达右下角那么即可以缩小值继续进行
right = mid;
}
else {
left = mid+1;
}
}
return left;
}
};