日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)

發布時間:2024/7/5 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

在一個 N x N 的坐標方格 grid 中,每一個方格的值 grid[i][j] 表示在位置 (i,j) 的平臺高度。

現在開始下雨了。當時間為 t 時,此時雨水導致水池中任意位置的水位為 t 。
你可以從一個平臺游向四周相鄰的任意一個平臺,但是前提是此時水位必須同時淹沒這兩個平臺。
假定你可以瞬間移動無限距離,也就是默認在方格內部游動是不耗時的。
當然,在你游泳的時候你必須待在坐標方格里面。

你從坐標方格的左上平臺 (0,0) 出發。
最少耗時多久你才能到達坐標方格的右下平臺 (N-1, N-1)?

示例 1: 輸入: [[0,2],[1,3]] 輸出: 3 解釋: 時間為0時,你位于坐標方格的位置為 (0, 0)。 此時你不能游向任意方向,因為四個相鄰方向平臺的高度都大于當前時間為 0 時的水位。等時間到達 3 時,你才可以游向平臺 (1, 1). 因為此時的水位是 3,坐標方格中的平臺沒有比水位 3 更高的, 所以你可以游向坐標方格中的任意位置示例2: 輸入: [[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]] 輸出: 16最終的路線用加粗進行了標記。 我們必須等到時間為 16,此時才能保證平臺 (0, 0)(4, 4) 是連通的

提示: 2 <= N <= 50. grid[i][j] 位于區間 [0, ..., N*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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。