diff --git a/algorithm/_sidebar.md b/algorithm/_sidebar.md index 2192e9a..8c68da6 100644 --- a/algorithm/_sidebar.md +++ b/algorithm/_sidebar.md @@ -1,4 +1,5 @@ -- [合并 2 个有序链表]() +- [岛屿个数](/algorithm/number-of-islands.md) +- [合并 2 个有序链表](/algorithm/merge-two-sorted-lists.md) - [带环链表](/algorithm/linked-list-cycle.md) - [电话号码的字母组合](/algorithm/letter-combinations-of-a-phone-number.md) - [格雷编码](/algorithm/gray-code.md) diff --git a/algorithm/number-of-islands.md b/algorithm/number-of-islands.md new file mode 100644 index 0000000..3b1ce6e --- /dev/null +++ b/algorithm/number-of-islands.md @@ -0,0 +1,42 @@ +# 岛屿个数(Number of Islands) + +> 🔔 参与讨论:https://www.isharkfly.com/t/number-of-islands/15124 + +## 描述 + +给一个01矩阵,求不同的岛屿的个数。 + +0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。 + +## 样例 + +在矩阵: + +``` +[ + [1, 1, 0, 0, 0], + [0, 1, 0, 0, 1], + [0, 0, 0, 1, 1], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 1] +] +``` + +中有 `3` 个岛。 + +## 代码 + +GitHub 的源代码,请访问下面的链接: +https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0433NumIslandsTest.java + +## 点评 + +本质是求矩阵中连续区域的个数,很容易想到需要用深度优先搜索 DFS 来解,我们需要建立一个 visited 数组用来记录某个位置是否被访问过,对于一个为 +true 且未被访问过的位置,我们递归进入其上下左右位置上为 true 的数,将其 visited 对应值赋为 +true,继续进入其所有相连的邻位置,这样可以将这个连通区域所有的数找出来,并将其对应的 visited 中的值赋 true,找完次区域后,我们将结果 +res 自增 1,然后我们在继续找下一个为 true 且未被访问过的位置,以此类推直至遍历完整个原数组即可得到最终结果。 + +这里需要有一个递归的调用。在递归调用之前需要进行判断是否超出边际,如果超出边际的话,就要跳出循环。 + +在一个节点进行遍历的时候,需要在递归调用的时候,同时针对这个节点搜索上下左右 4 个节点,如果找到需要了满足条件的 +true,就继续查找,如果没有找到就退出。在这个过程的时候,需要将访问过的节点保存到访问控制的 2 维数组中。以便于在下次查找的时候跳过这个节点。 \ No newline at end of file