C代码:二分查找 + BFS
int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
bool check(int** heights, int m, int n, int mid) {
int q[n * m][2];
int qleft = 0, qright = 0;
q[qright][0] = 0;
q[qright++][1] = 0;
int seen[m * n];
memset(seen, 0, sizeof(seen));
seen[0] = 1;
while (qleft < qright) {
int x = q[qleft][0], y = q[qleft++][1];
for (int i = 0; i < 4; ++i) {
int nx = x + dirs[i][0];
int ny = y + dirs[i][1];
// mid适配相邻节点的最小高度的差
if (nx >= 0 && nx < m && ny >= 0 && ny < n && seen[nx * n + ny] != 1 && abs(heights[x][y] - heights[nx][ny]) <= mid) {
q[qright][0] = nx;
q[qright++][1] = ny;
seen[nx * n + ny] = 1;
}
}
}
return seen[m * n - 1] == 1;
}
// 不断改变二分mid值,去适配相邻点之间的最小高度差
// 如果走到了最后一个节点,则继续减小mid(right = mid - 1),若没有则说明mid值太低了
// 最后二分结束后,返回最后一次成功的ans值
int minimumEffortPath(int** heights, int heightsSize, int* heightsColSize) {
int m = heightsSize;
int n = heightsColSize[0];
int left = 0, right = 999999, ans = 0; // 0、99999为高度差,对高度差进行二分法
while (left <= right) {
int mid = (left + right) / 2;
if (check(heights, m, n, mid)) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}