在算法面试中,系统化地分析和解决问题至关重要。本文将通过 Number of Islands 问题,演示如何使用 结构化思维 拆解复杂问题,确保思路清晰、表达精准、实现高效
📌 Step 1: 归类问题
"Actually, this is a Graph Problem."
在解决任何问题前,首先要明确它属于哪类问题。本题是 二维网格问题,但可以抽象为 图(Graph)问题:
- 节点(Node) :矩阵中的 每个 "1" 。
- 边(Edge) :相邻的 "1" 之间形成边(四方向相连)。
- 目标转换为:在构建的图中,计算连通分量的个数。
📝 为什么这一步重要?
✅ 明确问题的本质,找到合适的算法框架。
✅ 许多矩阵问题都可以转换成 图问题(Graph Traversal) ,便于归纳思维。
🔍 Step 2: 构建图
"My Node/Vertex is every '1' cell in the matrix"
在此步骤,我们正式建立 图的结构:
- 节点(Node) :网格中的 "1" 代表陆地,可视作图的节点。
- 边(Edge) :水平方向 & 垂直方向上的相邻 "1" 互相连接。
📝 为什么这一步重要?
✅ 隐式图建模:避免直接存储整个邻接表,节省空间。
✅ 通过构建邻接关系,后续可以直接使用 BFS / DFS 遍历 计算连通分量。
🔄 Step 3: 转化问题
"So the problem is asking me to find out the number of islands, which is actually asking me how many connected components are there in the graph I built."
- 本质上,本题 等价于计算图的连通分量(Connected Components)。
- 岛屿数量 = 图中连通块(Connected Components)个数。
📝 为什么这一步重要?
✅ 面试官更关注思维转换能力,是否能快速将问题抽象到已知算法框架。
✅ 明确 最优解的可能算法(Graph Traversal:DFS / BFS / 并查集) 。
📌 Step 4: 在图论中的定义
"Therefore, this is a Traversal (Reachable) Problem in Graph."
-
由于 "1" 之间是连通的,要计算连通分量的数量,本质上是 可达性问题(Reachability)。
-
图遍历(Graph Traversal) 是最佳工具:
- DFS(深度优先搜索)
- BFS(广度优先搜索)
📝 为什么这一步重要?
✅ 找到合适的算法类别,避免盲目使用暴力搜索。
✅ 保证最优性,选择高效算法来求解问题。
🚀 Step 5: 算法选择
"OK so to solve this problem I have both DFS and BFS work."
- DFS(深度优先搜索):以递归方式 深入搜索一个连通块,直至遍历完整个连通区域。
- BFS(广度优先搜索):使用队列 逐层遍历连通块,适合更广泛的访问模式。
时间复杂度分析
| 算法 | 时间复杂度 | 空间复杂度 | 适用情况 |
|---|---|---|---|
| DFS | O(M×N) | O(M×N)(递归栈) | 适合递归求解 |
| BFS | O(M×N) | O(M×N)(队列存储) | 适合层级遍历 |
📝 为什么这一步重要?
✅ 面试官更关注算法比较和权衡能力。
✅ 解释 选用 DFS / BFS 的理由,展示时间和空间复杂度分析。
✅ 选定最佳解法,体现清晰的决策思维。
🎯 结论
在面试时,通过 结构化分析,可以让你的解题思路更加清晰:
- 归类问题(Graph Problem)
- 建模转换(Nodes & Edges)
- 确定本质(Connected Components)
- 选择合适算法(Graph Traversal)
- 优化决策(DFS vs. BFS)
🔥 掌握这个思维方式,不仅适用于 Number of Islands,还能快速解决其他矩阵 & 图问题! 🚀