泛洪填充常见于岛屿问题:
- 1254.统计封闭岛屿的数目
- 694.不同的岛屿数
- 200.岛屿问题
解法三种:DFS,BSF,并查集
下面以200.岛屿问题解析泛洪填充的过程,题目描述:
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1 示例 2:
输入: 11000 11000 00100 00011 输出: 3 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
问题分析:以DFS思路为例,既然是要寻找岛屿个数(可以理解为连通域的个数),那就需要扫描整个网格图。对每个网格:
- 为 1:该位置属于某个岛屿的一部分,如果对其扩展开来搜寻连通的区域,最终会触及到边界,那么确认完一个岛屿。其中对于确认是岛屿一部分的网格(为1),需要将其“下沉”,即修改为0,不然会出现兜圈子,死循环。这样每完成一次深度遍历,我们就找到一个岛屿,岛屿次数加一。
- 为 0:说明该网格处为水域,直接跳过不进行深度遍历。
当全部遍历完后,就能得到岛屿的个数。
以下是DFS的实现代码:
package floodFill;
public class NumberOfIslands {
public static void main(String[] args) {
char[][] grid = new char[][]{
{
'1', '1', '1', '1', '0'},