LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
1. 題目
在一個 N x N 的坐標方格 grid 中,每一個方格的值 grid[i][j] 表示在位置 (i,j) 的平臺高度。
現在開始下雨了。當時間為 t 時,此時雨水導致水池中任意位置的水位為 t 。
你可以從一個平臺游向四周相鄰的任意一個平臺,但是前提是此時水位必須同時淹沒這兩個平臺。
假定你可以瞬間移動無限距離,也就是默認在方格內部游動是不耗時的。
當然,在你游泳的時候你必須待在坐標方格里面。
你從坐標方格的左上平臺 (0,0) 出發。
最少耗時多久你才能到達坐標方格的右下平臺 (N-1, N-1)?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/swim-in-rising-water
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
類似題目:LeetCode 1102. 得分最高的路徑(優先隊列BFS/極大極小化 二分查找)
跟上面題目一樣,這題是找到 路徑最大值 最小的路徑,只需要在二分查找的地方做點修改
class Solution {vector<vector<int>> dir = { {1,0},{0,1},{0,-1},{-1,0}};int N; public:int swimInWater(vector<vector<int>>& grid) {int l = grid[0][0], r = 2500, mid, ans;N = grid.size();while(l <= r){mid = (l + r) / 2;vector<vector<bool>> vis(N, vector<bool>(N,false));if(dfs(grid,0,0, mid, vis)){ //可以找到一條路徑,其上的值都 <= midans = mid;r = mid-1;}elsel = mid+1;}return ans;}bool dfs(vector<vector<int>>& grid, int x, int y, int MAX, vector<vector<bool>>& vis){vis[x][y] = true;int i, j, k;if(x == N-1 && y == N-1){return true;}for(k = 0; k < 4; k++){i = x + dir[k][0];j = y + dir[k][1];if(i >=0 && i < N && j >=0 && j < N && !vis[i][j] && grid[i][j] <= MAX){if(dfs(grid, i, j, MAX, vis))return true;}}return false;} };36 ms 9.7 MB
優先隊列也可以
struct point {int x;int y;int val;point(int x0, int y0, int v){x = x0;y = y0;val = v;} }; struct cmp {bool operator()(point& a, point& b) {return a.val > b.val;//值小的優先} }; class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}}; public:int swimInWater(vector<vector<int>>& A) {int m = A.size(), n = A[0].size(), i, j, x, y, k, ans = A[0][0];vector<vector<bool>> visited(m, vector<bool>(n,false));visited[0][0] = true;priority_queue<point,vector<point>,cmp> q;q.push(point(0, 0, A[0][0]));while(!q.empty()){if(q.top().val > ans)ans = q.top().val;i = q.top().x;j = q.top().y;q.pop();if(i==m-1 && j==n-1)return ans;for(k = 0; k < 4; ++k){x = i + dir[k][0];y = j + dir[k][1];if(x>=0 && x<m && y>=0 && y<n && !visited[x][y]){q.push(point(x, y, A[x][y]));visited[x][y] = true;}}}return ans;} };52 ms 8.5 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客 Bang! Bang!(动态规划)
- 下一篇: LeetCode 381. O(1) 时