哈希算法题目:岛屿数量
字数 790 2025-10-29 11:31:55
哈希算法题目:岛屿数量
题目描述:
给定一个由 '1'(陆地)和 '0'(水)组成的二维网格,计算网格中岛屿的数量。岛屿由水平或垂直相邻的陆地连接形成,假设网格四周被水包围。
示例:
输入:
grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3(因为有3个互不相连的陆地群)
解题步骤:
-
问题分析
岛屿的判定核心是连通性:相邻(上下左右)的 '1' 属于同一个岛屿。需要避免重复计数,因此访问过的陆地要标记。 -
哈希算法应用点
虽然主要解法是DFS/BFS,但哈希表可用于优化:- 记录已访问的坐标(避免重复访问)
- 序列化坐标作为唯一标识(例如将 (i, j) 转为字符串 "i,j")
-
深度优先搜索(DFS)实现
- 遍历网格每个点,遇到 '1' 且未访问过时:
- 岛屿计数 +1
- 递归访问其上下左右相邻的 '1',并通过哈希表标记已访问
- 递归终止条件:坐标越界、当前点为 '0' 或已访问
- 遍历网格每个点,遇到 '1' 且未访问过时:
-
具体步骤
a. 初始化哈希表visited和计数器count = 0
b. 遍历网格每个点 (i, j):- 若 grid[i][j] == '1' 且 (i, j) 未在
visited中:- 执行DFS:将当前点加入
visited,递归处理四个方向 - 完成DFS后
count++
c. 返回count
- 执行DFS:将当前点加入
- 若 grid[i][j] == '1' 且 (i, j) 未在
-
复杂度分析
- 时间复杂度:O(M×N)(每个点最多访问一次)
- 空间复杂度:O(M×N)(哈希表存储和递归栈最深可能为整个网格)
关键技巧:
- 使用哈希表快速判断坐标是否已访问
- 通过方向数组 [(-1,0), (1,0), (0,-1), (0,1)] 简化相邻点遍历