417. 太平洋大西洋水流问题

Problem: 417. 太平洋大西洋水流问题

思路

思路还是比较清晰的,本题思路与飞地的数量有异曲同工之妙。

本题中需要找到可以同时流向太平洋 和 大西洋 的地块。

一个地块的水可以流向四周的地块的条件是: 当前地块大于等于四周的地块。

我们可以从四周反推: 具体如下图所示

如当前地块的邻居有高于或者等于的地块,就说明可以从那个地块流向当前的地块

于是那个地块被记录到可以流向这个边的容器中。

1
2
3
4
5
6
//判断是否高于等于根
if (heights[item.first][item.second] >= heights[x][y]) {
//递归
toOcean[x][y] = true;
dfs(heights, toOcean,item.first, item.second);
}

如果装流向太平洋 和 大西洋的容器中同时包含了这个边,那么这个地块的水既可流向太平洋也可流向大西洋

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Solution {
private:
void dfs(vector<vector<int>>& heights, vector<vector<bool>>& toOcean, int x, int y) {
toOcean[x][y] = true;
//遍历临近节点
pair<int, int> neigbors[4]{
pair<int, int>(x, y + 1), pair<int, int>(x + 1, y),
pair<int, int>(x, y - 1), pair<int, int>(x - 1, y)};
for (auto item : neigbors) {
//判断越界
if (item.first < 0 || item.first >= heights.size() || item.second < 0 ||
item.second >= heights[0].size())
continue;
if(toOcean[item.first][item.second]) continue;
//判断是否高于等于根
if (heights[item.first][item.second] >= heights[x][y]) {
//递归
toOcean[x][y] = true;
dfs(heights, toOcean,item.first, item.second);
}
}
}
public:
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
//保存两个洋都可以到达的容器
vector<vector<bool>> toOceanPacific(heights.size(),vector<bool>(heights[0].size(),false));
vector<vector<bool>> toOceanAltantic(heights.size(),vector<bool>(heights[0].size(),false));
//上下边开始遍历
for (int i = 0; i < heights[0].size(); i++) {
dfs(heights,toOceanPacific,0, i);
dfs(heights,toOceanAltantic,heights.size() - 1,i);
}
//左右边开始遍历
for (int i = 0; i < heights.size(); i++) {
dfs(heights,toOceanPacific,i,0);
dfs(heights,toOceanAltantic,i,heights[0].size()-1);
}
// for (int i = 0; i < heights.size(); i++) {
// for (int j = 0; j < heights[0].size(); j++) {
// cout << toOceanPacific[i][j] << " ";
// }
// cout << endl;
// }
// cout << "---" << endl;
// for (int i = 0; i < heights.size(); i++) {
// for (int j = 0; j < heights[0].size(); j++) {
// cout << toOceanAltantic[i][j] << " ";
// }
// cout << endl;
// }
//得到两个容器中都有的元素
vector<vector<int>> res;
for (int i = 0; i < heights.size(); i++) {
for (int j = 0; j < heights[0].size(); j++) {
if(toOceanPacific[i][j] && toOceanAltantic[i][j]) {
res.push_back(vector<int>{i,j});
}
}
}
//返回
return res;
}
};