题目分析
岛屿数量问题是一个经典的问题,与朋友圈问题(Leetcode 547)类似,只不过朋友圈问题中的矩阵是对称的,而岛屿数量中的矩阵是非对称的。此题可以使用DFS,BFS和并查集进行求解。
DFS
DFS是先找到一块岛屿,然后对这个岛屿进行深度优先搜索,已知沿着某一个路径走下去,如果没用路可以走则回溯。直到所有的路径都走完,说明将这个岛屿探索完毕,将其剔除,从剩余的地图上继续寻找,直到所有的岛屿都找到,则算法结束,有关DFS的知识可以参考我的另一篇博客深度优先搜索(Depth-First-Search)。
1 | class Solution: |
BFS
BFS是先找到一块岛屿,然后对这个岛屿进行广度优先搜索,以某个点为中心,先寻找距离该点为1的所有陆地,然后再寻找与该点距离为2的所有陆地,依次进性,直到将与该点连通的所有陆地都寻找完毕,说明将这个岛屿探索完毕,将其剔除,从剩余的地图上继续寻找,直到所有的岛屿都找到,则算法结束,有关BFS的知识可以参考我的另一篇博客广度优先搜索(Breadth-First-Search)。
1 | from collections import deque |
并查集
并查集算法不是很常用,但是思路很清晰,初始设每个陆地都是一个岛屿,比较两个相邻的岛屿是否为同一个岛屿,如果不是同一个岛屿则合并这两个岛屿,并将岛屿数量减1,最后剩余的岛屿数量就是本题的解。难点在于如何判断两个相邻岛屿为同一个岛屿,而且如何合并两个岛屿?每一个岛屿设定一个首都即可,如果两个岛屿的首都相同,则在同一个岛屿上,否则不在同一个岛屿,合并时直接选择某一个首都最为总首都即可实现岛屿合并。
1 | class UnionFind: |
刷题总结
朋友圈问题是一类经典的面试问题,因此小伙伴们务必掌握基本的DFS和BFS算法,至于并查集问题,大家理解即可,因为并查集实现也没用DFS和BFS容易,而且时间复杂度也并没有提升,只需要小伙伴们能够说出并查集思路。