778 .上水で泳ぐ
10436 ワード
778 .上水で泳ぐ
説明
この値はn x n
°であり、その値242479142・・・は、24479142・142である.
雨が降り始めた.時間grid
では、水の深さは242479142である.正方形から別の4方向に隣接した正方形の場合、両方の正方形の標高が個別に最大grid[i][j]
である場合のみ、泳ぐことができます.ゼロの時間で無限の距離を泳ぐことができます.もちろん、あなたの水泳中にグリッドの境界の中に滞在する必要があります.
左上角(i, j)
で始まる場合は、右下角242479142度に達するまで最低時間を返します.
例1 :
Input: grid = [[0,2],[1,3]]
Output: 3
Explanation:
At time 0, you are in grid location (0, 0).
You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0.
You cannot reach point (1, 1) until time 3.
When the depth of water is 3, we can swim anywhere inside the grid.
例2 :
Input: grid = [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
Output: 16
Explanation: The final route is shown.
We need to wait until time 16 so that (0, 0) and (4, 4) are connected.
制約
この値は
n x n
°であり、その値242479142・・・は、24479142・142である.雨が降り始めた.時間
grid
では、水の深さは242479142である.正方形から別の4方向に隣接した正方形の場合、両方の正方形の標高が個別に最大grid[i][j]
である場合のみ、泳ぐことができます.ゼロの時間で無限の距離を泳ぐことができます.もちろん、あなたの水泳中にグリッドの境界の中に滞在する必要があります.左上角
(i, j)
で始まる場合は、右下角242479142度に達するまで最低時間を返します.例1 :
Input: grid = [[0,2],[1,3]]
Output: 3
Explanation:
At time 0, you are in grid location (0, 0).
You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0.
You cannot reach point (1, 1) until time 3.
When the depth of water is 3, we can swim anywhere inside the grid.
例2 :
Input: grid = [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
Output: 16
Explanation: The final route is shown.
We need to wait until time 16 so that (0, 0) and (4, 4) are connected.
制約
t
t
t
(n - 1, n - 1)
(0, 0)
.解決策
解決方法1
直観
コード
class Solution {
public:
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int n;
vector<vector<int>> g;
vector<vector<bool>> visited;
bool dfs(int x, int y, int elevation) {
if (x == n - 1 && y == n - 1) return true;
visited[x][y] = true;
for (int k = 0; k < 4; k++) {
int i = x + dx[k], j = y + dy[k];
if (i >= 0 && i < n && j >= 0 && j < n && g[i][j] <= elevation && !visited[i][j] && dfs(i, j, elevation))
return true;
}
return false;
}
bool check(int elevation) {
if (g[0][0] > elevation) return false;
visited = vector<vector<bool>>(n, vector<bool>(n, false));
return dfs(0, 0, elevation);
}
int swimInWater(vector<vector<int>>& grid) {
g = grid;
n = grid.size();
int l = 0, r = n * n;
while (l < r) {
int mid = l + r >> 1;
if (check(mid))
r = mid;
else
l = mid + 1;
}
return l;
}
};
複雑さ
ソリューション2
直観
コード
複雑さ
類似の質問
Reference
この問題について(778 .上水で泳ぐ), 我々は、より多くの情報をここで見つけました
https://dev.to/jiangwenqi/778-swim-in-rising-water-1kmh
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(778 .上水で泳ぐ), 我々は、より多くの情報をここで見つけました https://dev.to/jiangwenqi/778-swim-in-rising-water-1kmhテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol