5548. 最小体力消耗路径 二分
Posted xgbt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5548. 最小体力消耗路径 二分相关的知识,希望对你有一定的参考价值。
你准备参加一场远足活动。给你一个二维 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;
}
};
以上是关于5548. 最小体力消耗路径 二分的主要内容,如果未能解决你的问题,请参考以下文章