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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

通过观察样例,我们可以发现,最后的结果并不是求解陆地的数量,而是由这些陆地可以构成的岛屿数量,一开始我以为是求解陆地的数量,导致错误。后来才发现是求的是岛屿的数量。

1、找到第一个为陆地的下标
2、将这个陆地以及附近的所有陆地都置0,如何将当前陆地的所有陆地都置0呢?这时候就利用深度优先搜索,判断当前陆地的四个方向的位置是否为陆地即可。之所以需要将陆地置0,是避免下次计算岛屿的数目的时候避免重复
访问。当然也可以不置0,只是这时候需要定义一个二维数组,表示当前这个陆地已经被访问过了。
3、重复上述操作,直到整个字符数组遍历完毕。

对应的代码:(采用置0的方式)

class Solution {int result = 0;public int numIslands(char[][] grid) {if(grid == null || grid.length == 0 || grid[0].length == 0)return 0;int row,col,i,j;row = grid.length;col = grid[0].length;for(i = 0; i < row; i++){for(j = 0; j < col; j++){//找到第一个陆地if(grid[i][j] == '1'){result++;//进入递归,将它的相邻的陆地变成水dfs(grid,i,j,row,col);}}}return result;}public void dfs(char[][] grid,int x,int y,int row,int col){if(x < 0 || x >= row || y < 0 || y >= col || grid[x][y] == '0')return;grid[x][y] = '0'; dfs(grid,x + 1,y,row,col);dfs(grid,x - 1, y,row,col);dfs(grid,x,y + 1,row,col);dfs(grid,x,y - 1,row,col);}
}

运行结果:

没有采用置0的方式,而是定义一个二维数组。
对应的代码:

class Solution {int result = 0;boolean[][] flag;int[] move_x = new int[]{0,1,0,-1}; //移动的四个方向int[] move_y = new int[]{1,0,-1,0};public int numIslands(char[][] grid) {if(grid == null || grid.length == 0 || grid[0].length == 0)return 0;int row,col,i,j;row = grid.length;col = grid[0].length;flag = new boolean[row][col];for(i = 0; i < row; i++){for(j = 0; j < col; j++){//找到第一个陆地,并且这个陆地没有被访问过if(grid[i][j] == '1' && flag[i][j] == false){result++;dfs(grid,i,j,row,col);}}}return result;}public void dfs(char[][] grid,int x,int y,int row,int col){flag[x][y] = true;int a,b,i;for(i = 0; i < 4; i++){a = x + move_x[i];b = y + move_y[i];if(a < 0 || a >= row || b < 0 || b >= col || flag[a][b] == true || grid[a][b] == '0')continue;dfs(grid,a,b,row,col); //访问x,y这个陆地相连的陆地,然后将它标记已经访问过了,这样下次遍历到这个下标的时候,不会再进行深度优先遍历}}
}

运行结果:

LeetCode 岛屿数量相关推荐

  1. 广度优先搜索——岛屿数量(Leetcode 200)

    题目选自Leetcode 200. 岛屿数量 经典的搜索题,求岛屿数量 这里我用的是广度优先搜索BFS 最朴素的方法, 虽然效率不高,但是简单易懂 主要的问题在于:如何确定有多少个岛屿? 每次对一个& ...

  2. Leetcode 200.岛屿数量

    Time: 20190902 Type: Medium 题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地 ...

  3. Leetcode 200. 岛屿数量 解题思路及C++实现

    解题思路: 典型的深度优先搜索问题,跟第130题 被围绕的区域 有点像,只不过这里不仅要找出被水包围的岛屿,还要计算这些岛屿的总数. 使用深度优先搜索的方法,大循环是遍历整个grid数组(两个for循 ...

  4. 【算法思路】常见岛屿数量的算法题

    岛屿的最大面积 思路:dfs 两层遍历,遇到岛屿时,则进入深度优先遍历,也就是递归 岛屿深度优先遍历 判断是否越界,或者是不是岛屿,如果越界或者不是岛屿则返回 将该岛屿置为海洋,并将面积加一 从该岛屿 ...

  5. 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛

    文章目录 岛屿问题 如何在网格上做DFS(通用解) 463.岛屿的周长 题目 题解 -通用模板 题解2 200.岛屿数量 题目 题解 695.岛屿的最大面积 题目 题解 827.最大人工岛 题目 题解 ...

  6. Leetcode岛屿问题系列分析

    在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如: 200. 岛屿数量 (Medium) 463. 岛屿的周长 (Easy) 695. 岛屿的最大面积 (Medium) 827. 最大人 ...

  7. 岛屿的个数java_LeetCode 200:岛屿数量 Number of Islands

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

  8. 200. Number of Islands**(岛屿数量)

    200. Number of Islands**(岛屿数量) https://leetcode.com/problems/number-of-islands/ 题目描述 Given an m x n ...

  9. 力扣200岛屿数量(DFS/BFS)

    200. 岛屿数量 - 力扣(LeetCode) (leetcode-cn.com) 1.DFS DFS的思路是,首先遍历整个表,找到1结果就加一,之后通过DFS将找到的1连通区域内的所有1变为0,代 ...

最新文章

  1. Windows下 安装Oracle Java 11 并设置环境变量
  2. 存储组件的实现思路分析及代码实现
  3. 帧布局(FrameLayout)及属性
  4. pythondict初始化_利用defaultdict对字典进行全局初始化。
  5. java 怎么用毫秒_java1.8中如何使用精确到毫秒的时间
  6. 树形图,多层级目录等其他名称待补充……
  7. vuex-token的持久化
  8. Kali2.0中peda与pwntools的安装
  9. framework层Service的基础知识和常见问题
  10. 第7章第25节:双图排版:两张图片横竖交错叠加排版 [PowerPoint精美幻灯片实战教程]
  11. [arduino]红外接收测试工装
  12. 平面设计师okr_掌握OKR工作法,教你快速提升工作效率
  13. NTL的安装、连接与使用(基于CentOS、Clion)
  14. 蚁群算法c语言实现加注释,蚁群算法代码实现
  15. 机器学习实验二 决策树
  16. Java分布式中文分词组件 - word分词
  17. LeetCode 每日一题1006. 笨阶乘
  18. 病毒、蠕虫和木马的区别
  19. heaps 和 priority queue堆和优先队列的定义和数据结构表示
  20. %在c语言中起什么作用

热门文章

  1. java、websokect、amazeUI、uEditor实现简易的webChat功能
  2. AI软件克隆你的声音,全球诈骗案件已屡次得逞!
  3. bdd java 界面测试_基于Cucumber的BDD自动化测试
  4. 【附源码】计算机毕业设计java校园志愿者服务系统设计与实现
  5. Linux系统RAR加密解密
  6. 人工噪声辅助下的多天线隐蔽通信技术分析
  7. SONM月报_2018年9月
  8. TEE7是什么?好不好
  9. 单招计算机面试技巧和注意事项,单招面试技巧和注意事项有哪些
  10. centos的yum源网络代理设置