秒杀所有岛屿题目(DFS)

200. 岛屿数量

1254. 统计封闭岛屿的数目

695. 岛屿的最大面积

1905. 统计子岛屿

130. 被围绕的区域

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

定义框架

本质其实就是 DFS,关于 DFS 详细内容可见 回溯 (DFS) 算法框架,下面直接给出框架

岛屿数量

题目详情可见 岛屿数量

思路:把与 1 相连的区域进行 FloodFill

10

统计封闭岛屿的数目

题目详情可见 统计封闭岛屿的数目

前提:与岸边相连的岛屿不算封闭岛屿

思路:首选去除与岸边相连的岛屿,然后按照「岛屿数量」的思路计算

相似题目:飞地的数量

11

岛屿的最大面积

题目详情可见 岛屿的最大面积

思路:新增一个变量记录每个岛屿的面积,然后选择出最大面积

统计子岛屿

题目详情可见 统计子岛屿

子岛屿概念:如果 B 某一位置是岛屿,A 相同位置也必须是岛屿

思路:如果 B 是岛屿,但 A 不是岛屿,则对 B 进行 FloodFill

12

被围绕的区域

题目详情可见 被围绕的区域

这个题目可以用「并查集」,也可以使用「DFS」去解决,这篇文章给出 DFS 的解决方法。想要了解「并查集」的方法,可见 并查集 (Union-Find)

思路:首选选择出与岸边相连的岛屿并标记为F,然后把内部封闭的岛屿全部置为X,最后把F置为O

13

太平洋大西洋水流问题

题目详情可见 太平洋大西洋水流问题

这个题目很有意思,有意思到一开始题目都没看懂!!!麻了!!!

14

先简单解释一下这个题目的意思:与 Ocean 直接相连的格子中的水可以直接流入 Ocean 中;非直接相连的格子中的水只能流到相邻且比自己矮 (相等也可以) 的格子中

这个题目的问题是:求出既可以流入 Pacific Ocean,也可以流入 Atlantic Ocean 中的格子

思路:

如下图所示:

2

好了,大功告成!!!

但是还没有完,这里讲一下本人的一个错误思路!!由于最近学了「动态规划」,看到这个题目,就感觉很像,就尝试用 DP 去写了一下。关于动态规划的详细内容可见 动态规划解题套路框架

我的思路,就是用两个dp[][]数组记录可以流入两个 Ocean 的格子,然后取交集就行了

关于状态转移,可以看下图:

3

通过如上图所标注的方向来填满dp[][]数组。下面给出详细代码:

本来以为可以一发就过的,但是事与愿违。事实证明「动态规划」是错误的!!!

下面给出一个反例就明白了!!!

4

当我们处理(2, 1)的时候,根据上方和左方的状态判断显然是不可以流入 Pacific Ocean 的。但其实是错误的,我们看这样一条路径:

5

很明显是可以的,所以我们的状态转移方程是错误的!!!

最后这个题目貌似 DP 是写不出来的!!!也算是一个错误反例练习了一下 DP。。。