岛屿个数(Number of Islands)
This commit is contained in:
parent
05adc63b3a
commit
c5505041ad
|
@ -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)
|
||||
|
|
|
@ -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 维数组中。以便于在下次查找的时候跳过这个节点。
|
Loading…
Reference in New Issue