思路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