5548. 最小體力消耗路徑 二分
阿新 • • 發佈:2020-10-25
你準備參加一場遠足活動。給你一個二維rows x columns的地圖heights,其中heights[row][col]表示格子(row, col)的高度。一開始你在最左上角的格子(0, 0),且你希望去最右下角的格子(rows-1, columns-1)(注意下標從 0 開始編號)。你每次可以往 上,下,左,右四個方向之一移動,你想要找到耗費 體力 最小的一條路徑。
一條路徑耗費的 體力值是路徑上相鄰格子之間 高度差絕對值的 最大值決定的。
請你返回從左上角走到右下角的最小體力消耗值。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/path-with-minimum-effort
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
最小化最大值->二分答案
然後正常寬搜
class Solution { public: int dir[4][2] = {0,1,0,-1,1,0,-1,0}; struct Node { int x, y; Node(int x, int y):x(x), y(y){} }; int minimumEffortPath(vector<vector<int>>& G) { int n = G.size(); int m = G[0].size(); vector <vector<bool>> vis = vector(n, vector<bool>(m, false)); int ans = 0; int l = 0, r = 999999; while (l <= r) { int mid = l + ((r - l) / 2); vis = vector(n, vector<bool>(m, false)); queue <Node> q; q.emplace(Node(0, 0)); vis[0][0] = true; while (!q.empty()) { Node node = q.front(); int x = node.x; int y = node.y; q.pop(); for (int i = 0; i < 4; i++) { int tx = x + dir[i][0]; int ty = y + dir[i][1]; if (tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty] && abs(G[x][y] - G[tx][ty]) <= mid) { q.emplace(Node(tx, ty)); vis[tx][ty] = true; } } } if (vis[n - 1][m - 1]) { ans = mid; r = mid - 1; } else { l = mid + 1; } } return ans; } };