文章目录

  • 1. 题目信息
  • 2. 解题
    • 2.1 DFS
    • 2.2 BFS

1. 题目信息

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

示例 1:输入:
11110
11010
11000
00000输出: 1示例 2:输入:
11000
11000
00100
00011输出: 3

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 DFS

图的连通性问题,主程序启动DFS,一次搜索中,遇到1的点将其置为0(只寻找1的点),后面不会再重复查找,对上下左右的点(如果存在且为1)递归查找。主程序中启动DFS的次数即为答案。

class Solution
{public:int numIslands(vector<vector<char>>& grid){int i, j, numofislands = 0;for(i = 0; i < grid.size(); ++i){for(j = 0; j < grid[i].size(); ++j){if(grid[i][j] == '1'){numofislands++;dfs(grid,i,j);}}}return numofislands;}void dfs(vector<vector<char>>& grid, int i, int j){grid[i][j] = '0';//标记走过了,修改了地图(不影响解题)if(i-1 >= 0 && grid[i-1][j] == '1')dfs(grid,i-1,j);if(j-1 >= 0 && grid[i][j-1] == '1')dfs(grid,i,j-1);if(i+1 < grid.size() && grid[i+1][j] == '1')dfs(grid,i+1,j);if(j+1 < grid[i].size() && grid[i][j+1] == '1')dfs(grid,i,j+1);}
};

2.2 BFS

同样的采用BFS,对点1的四周存在且为1的点入队,迭代查找
竟然超时了,有坑的代码请查看我的解题评论。

找到为1的点,第一时间置0,不要等到出队的时候再置0,会造成其他周围的几个点没有及时置0,造成的重复入队,效率降低。

class Solution//BFS
{public:int numIslands(vector<vector<char>>& grid){if(grid.empty())return 0;int i, j, r, c, numofislands = 0;int x = grid.size(), y = grid[0].size();queue<pair<int,int> > q;for(i = 0; i < x; ++i){for(j = 0; j < y; ++j){if(grid[i][j] == '1'){numofislands++;q.push({i,j});while(!q.empty()){r = q.front().first;c = q.front().second;//grid[r][c] = '0';//标记走过了(不要写在这里,否则,会重复检查很多遍)q.pop();if(r-1 >= 0 && grid[r-1][c] == '1'){q.push({r-1,c});grid[r-1][c] = '0';//写在这里,找到了就马上第一时间标记}if(c-1 >= 0 && grid[r][c-1] == '1'){q.push({r,c-1});grid[r][c-1] = '0';}if(r+1 < x && grid[r+1][c] == '1'){q.push({r+1,c});grid[r+1][c] = '0';}if(c+1 < y && grid[r][c+1] == '1'){q.push({r,c+1});grid[r][c+1] = '0';}}}}}return numofislands;}
};

LeetCode 200. 岛屿数量(图的遍历)相关推荐

  1. Leetcode 200.岛屿数量

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

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

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

  3. leetcode 200.岛屿数量 c代码

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

  4. leetcode —— 200. 岛屿数量

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

  5. Javascript(JS) leetcode 200. 岛屿数量

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网格的四条边 ...

  6. Leetcode 200 岛屿数量 (每日一题 20210720)

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量.岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成.此外,你可以假设该网格的四条边均被 ...

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

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

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

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

  9. 岛屿类-网格类问题-DFS | 力扣200. 岛屿数量

    本文讲解200. 岛屿数量问题,属于常见的岛屿类-网格类问题 本题使用DFS的思想 1 题目 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围, ...

最新文章

  1. 20以内分数化小数表_数与代数之小数
  2. 8 线程安全且高效的单例模式
  3. .net 中debug 微软内部代码
  4. 运行gulp_Gulp的基本使用
  5. java 开发手机web,手机web app开发笔记
  6. 人工智能——自动驾驶仿真软件
  7. ASP.NET生成Excel并下载
  8. 使用ARCGIS对shp数据添加投影坐标系
  9. 2023考研高数接力题典1800习题讲解
  10. 阿里字体小图标的使用
  11. 流量卡之家:物联网帮助我们应对全球问题的5种方式
  12. 《达芬奇密码》读后感
  13. 云计算:吹尽狂沙始到金
  14. python批量检索文献pubmed_PubMed快速检索文献,学学这些技巧!
  15. Netlogon漏洞复现
  16. Windows网速显示软件TrafficMonitor
  17. Ubuntu18 ROS运行报错exit code -11
  18. p4交换机模拟器bmv2的一些教程
  19. Linux 彩蛋,你玩过几个?
  20. 15个可以做签名的高权重论坛

热门文章

  1. C语言常量类型及名称,菜鸟带你入门C语言|基本数据类型之常量
  2. android收入管理系统,毕业设计(论文)-基于Android系统的家庭理财通软件的设计——收入管理模块.docx...
  3. 8.在idea中配置maven
  4. HDU 4701 Game
  5. [3.30校内训练赛]
  6. 面向对象之类的内建函数
  7. hdu 2049 考新郎
  8. Linux CentOS7/RHEL7关闭ctrl+alt+delete功能键
  9. assets目录与res/raw目录下文件的区别
  10. 分享一篇很不错的CMake入门文章,值得收藏细读!