【leetcode.200】岛屿数量

秒速五厘米 2022-12-11 02:26 233阅读 0赞

一、题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
[
[‘1’,’1’,’1’,’1’,’0’],
[‘1’,’1’,’0’,’1’,’0’],
[‘1’,’1’,’0’,’0’,’0’],
[‘0’,’0’,’0’,’0’,’0’]
]
输出: 1
示例 2:

输入:
[
[‘1’,’1’,’0’,’0’,’0’],
[‘1’,’1’,’0’,’0’,’0’],
[‘0’,’0’,’1’,’0’,’0’],
[‘0’,’0’,’0’,’1’,’1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。


二、思路

从网格的左上角开始,采用深度优先遍历,将与这个点连通的陆地全部遍历一遍。为了避免重复遍历,需要将遍历过的陆地进行标记。

陆地为1,水为0,遍历过的陆地为2。

假设(m,n)为网格上的任意一点,那么它的四周坐标为:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTkxOTAz_size_16_color_FFFFFF_t_70

那么,当前思路是:

顺序遍历二维数组中的元素

  1. 比如现在选择第一个位置,即(0,0)。如果当前位置为1,则岛屿数量自增1
  2. 接着开始访问旁边所有的点:
  3. 沿着该点一直往上找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。
  4. 沿着该点一直往下找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。
  5. 沿着该点一直往左找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。
  6. 沿着该点一直往右找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。

三、代码实现

  1. public class Number200 implements DFS {
  2. // (m-1,n)
  3. // (m,n-1) (m, n ) (m,n+1)
  4. // (m+1,n)
  5. char[][] map;
  6. public int numIslands(char[][] grid) {
  7. map = grid;
  8. int sum = 0;
  9. for (int i = 0; i < map.length; i++) {
  10. for (int j = 0; j < map[0].length; j++) {
  11. if (map[i][j] == '1') {
  12. sum++;
  13. dfs(i, j);
  14. }
  15. }
  16. }
  17. return sum;
  18. }
  19. private void dfs(int m, int n) {
  20. //如果不在区域中
  21. if (!inArea(m, n)) {
  22. return;
  23. }
  24. //如果是水
  25. if (map[m][n] == '0') {
  26. return;
  27. }
  28. //如果已经遍历过
  29. if (map[m][n] == '2') {
  30. return;
  31. }
  32. //当前位置为陆地,那么设置为访问过
  33. map[m][n] = '2';
  34. //一直向上访问
  35. dfs(m - 1, n);
  36. //一直向下访问
  37. dfs(m + 1, n);
  38. //一直向左访问
  39. dfs(m, n - 1);
  40. //一直向右访问
  41. dfs(m, n + 1);
  42. }
  43. //判断是否在网格中
  44. private boolean inArea(int m, int n) {
  45. return m >= 0 && m < map.length
  46. && n >= 0 && n < map[0].length;
  47. }
  48. public static void main(String[] args) {
  49. char[][] map = {
  50. {'1', '1', '1', '1', '0'}, {'1', '1', '0', '1', '0'}, {'1', '1', '0', '0', '0'}, {'0', '0', '0', '0', '0'}};
  51. int i = new Number200().numIslands(map);
  52. System.out.println(i);
  53. }
  54. }

提交答案:

2020092718233380.png

发表评论

表情:
评论列表 (有 0 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读

    相关 200. 岛屿数量

    200. 岛屿数量 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上

    相关 leetcode200. 岛屿数量

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包

    相关 leetcode.200岛屿数量

    一、题目描述 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地

    相关 LeetCode200. 岛屿数量

    题目难度:中等 题目描述: > 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 > 岛屿总是被水包围,并且每座岛屿只能由水平方