思路1:BFS
- 此题为经典DFS、经典BFS问题
- 从低往高,从边缘往中间进行搜索LC417. 太平洋大西洋水流问题
- 这个解法是参考了大佬的,亮点主要包括以下几点:
- 利用
|= 1; |= 2这样的手段去记录状态矩阵,非常简洁 - BFS的起始点设置了很多个,这样可以加快遍历速度
- 利用状态矩阵前后数值是否一致,去判断是否需要加入队列(在加入队列的时候设置去重的检验)
- 将
valid(x, y)函数独立到外部,写法简洁易懂。
代码1:BFS
class Solution {public: int dx[4] = {0, 1, -1, 0}; int dy[4] = {1, 0, 0, -1}; bool valid(int x, int y, int row, int col) { if (x < 0 || x >= row) { return false; } if (y < 0 || y >= col) { return false; } return true; } vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) { int row = heights.size(), col = heights[0].size(); vector<vector<int>> rec(row, vector<int>(col, 0)); queue<pair<int, int>> q; // 初始队列需要放进去很多东西,同时,需要在入队时设置矩阵状态,避免重复遍历 for (int i = 0; i < row; ++i) { q.push(make_pair(i, 0)); rec[i][0] |= 1; q.push(make_pair(i, col - 1)); rec[i][col - 1] |= 2; } // p:01 A:10 // 重复放也不要怕,进入队列的时候有去重的检验手段了 for (int i = 0; i < col; ++i) { q.push(make_pair(0, i)); rec[0][i] |= 1; q.push(make_pair(row - 1, i)); rec[row - 1][i] |= 2; } while (!q.empty()) { pair<int, int> cur_node = q.front(); q.pop(); int cur_x = cur_node.first, cur_y = cur_node.second; for (int i = 0; i < 4; ++i) { int nxt_x = cur_x + dx[i], nxt_y = cur_y + dy[i]; if (!valid(nxt_x, nxt_y, row, col)) { continue; } if (heights[nxt_x][nxt_y] < heights[cur_x][cur_y]) { continue; } // 说明已经访问过了 if (rec[nxt_x][nxt_y] == rec[cur_x][cur_y]) { continue; } q.push(make_pair(nxt_x, nxt_y)); rec[nxt_x][nxt_y] |= rec[cur_x][cur_y]; } } vector<vector<int>> ans; for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { // P:01 A:10 both:11 if (rec[i][j] == 3) { ans.push_back({i, j}); } } } return ans; }};
思路2:DFS todo