如何系统化解决图问题:以“Number of Islands”为例

99 阅读3分钟

在算法面试中,系统化地分析和解决问题至关重要。本文将通过 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(广度优先搜索):使用队列 逐层遍历连通块,适合更广泛的访问模式。

时间复杂度分析

算法时间复杂度空间复杂度适用情况
DFSO(M×N)O(M×N)(递归栈)适合递归求解
BFSO(M×N)O(M×N)(队列存储)适合层级遍历

📝 为什么这一步重要?

面试官更关注算法比较和权衡能力
✅ 解释 选用 DFS / BFS 的理由,展示时间和空间复杂度分析。
✅ 选定最佳解法,体现清晰的决策思维。


🎯 结论

在面试时,通过 结构化分析,可以让你的解题思路更加清晰:

  1. 归类问题(Graph Problem)
  2. 建模转换(Nodes & Edges)
  3. 确定本质(Connected Components)
  4. 选择合适算法(Graph Traversal)
  5. 优化决策(DFS vs. BFS)

🔥 掌握这个思维方式,不仅适用于 Number of Islands,还能快速解决其他矩阵 & 图问题! 🚀