LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 BFS 廣度優(yōu)先搜索
- 2.2 DFS 深度優(yōu)先搜索
1. 題目
給定一個(gè) m x n 的非負(fù)整數(shù)矩陣來(lái)表示一片大陸上各個(gè)單元格的高度。
“太平洋”處于大陸的左邊界和上邊界,而“大西洋”處于大陸的右邊界和下邊界。
規(guī)定水流只能按照上、下、左、右四個(gè)方向流動(dòng),且只能從高到低或者在同等高度上流動(dòng)。
請(qǐng)找出那些水流既可以流動(dòng)到“太平洋”,又能流動(dòng)到“大西洋”的陸地單元的坐標(biāo)。
提示: 輸出坐標(biāo)的順序不重要 m 和 n 都小于150示例: 給定下面的 5x5 矩陣:太平洋 ~ ~ ~ ~ ~ ~ 1 2 2 3 (5) *~ 3 2 3 (4) (4) *~ 2 4 (5) 3 1 *~ (6) (7) 1 4 5 *~ (5) 1 1 2 4 ** * * * * 大西洋返回: [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上圖中帶括號(hào)的單元).來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/pacific-atlantic-water-flow
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 逆向考慮,從兩個(gè)大洋,往高處或等高的地方流
- 留到2次的地方為答案
2.1 BFS 廣度優(yōu)先搜索
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}}; public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {if(matrix.empty() || matrix[0].empty())return {};int m = matrix.size(), n = matrix[0].size(), i, j, x, y, k, v;vector<vector<bool>> visited(m, vector<bool>(n,false));queue<vector<int>> q;for(i = 0; i < n; ++i)//加入太平洋的兩條邊{q.push({0,i});visited[0][i] = true;}for(i = 1; i < m; ++i)//加入太平洋的兩條邊{q.push({i,0});visited[i][0] = true;}while(!q.empty()){x = q.front()[0];y = q.front()[1];v = matrix[x][y];q.pop();for(k = 0; k < 4; ++k){i = x + dir[k][0];j = y + dir[k][1];if(i>=0 && i<m && j>=0 && j<n && !visited[i][j] && v <= matrix[i][j]){q.push({i,j});visited[i][j] = true;}}}vector<vector<bool>> visited2(m, vector<bool>(n,false));for(i = 0; i < n; ++i)//加入大西洋的兩條邊{q.push({m-1,i});visited2[m-1][i] = true;}for(i = 0; i < m-1; ++i)//加入大西洋的兩條邊{q.push({i,n-1});visited2[i][n-1] = true;}while(!q.empty()){x = q.front()[0];y = q.front()[1];v = matrix[x][y];q.pop();for(k = 0; k < 4; ++k){i = x + dir[k][0];j = y + dir[k][1];if(i>=0 && i<m && j>=0 && j<n && !visited2[i][j] && v <= matrix[i][j]){q.push({i,j});visited2[i][j] = true;}}}vector<vector<int>> ans;for(i = 0; i < m; ++i){for(j = 0; j < n; ++j){if(visited[i][j] && visited2[i][j])//訪問(wèn)過(guò)兩次的ans.push_back({i,j});}}return ans;} };112 ms 18.7 MB
2.2 DFS 深度優(yōu)先搜索
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m, n; public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {if(matrix.empty() || matrix[0].empty())return {};m = matrix.size(), n = matrix[0].size();int i, j;vector<vector<bool>> visited(m, vector<bool>(n,false));for(i = 0; i < n; ++i){if(!visited[0][i]){visited[0][i] = true;dfs(0,i,visited,matrix);}}for(i = 1; i < m; ++i){if(!visited[i][0]){visited[i][0] = true;dfs(i,0,visited,matrix);}}vector<vector<bool>> visited2(m, vector<bool>(n,false));for(i = 0; i < n; ++i){if(!visited2[m-1][i]){visited2[m-1][i] = true;dfs(m-1,i,visited2,matrix);}}for(i = 0; i < m-1; ++i){if(!visited2[i][n-1]){visited2[i][n-1] = true;dfs(i,n-1,visited2,matrix);}}vector<vector<int>> ans;for(i = 0; i < m; ++i){for(j = 0; j < n; ++j){if(visited[i][j] && visited2[i][j])ans.push_back({i,j});}}return ans;}void dfs(int x, int y, vector<vector<bool>>& visited,vector<vector<int>>& matrix){int i, j, v = matrix[x][y];for(int k = 0; k < 4; ++k){i = x + dir[k][0];j = y + dir[k][1];if(i>=0 && i<m && j>=0 && j<n && !visited[i][j] && v <= matrix[i][j]){visited[i][j] = true;dfs(i, j, visited, matrix);}} } };100 ms 15.4 MB
總結(jié)
以上是生活随笔為你收集整理的LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Kaggle】Intermediate
- 下一篇: LeetCode 1062. 最长重复子