Leetcode 200. 岛屿数量

阳光穿透心脏的1/2处 2023-02-14 03:01 80阅读 0赞

Leetcode 200. 岛屿数量

  • 1、问题分析
  • 2、问题解决
  • 3、总结

1、问题分析

题目链接:https://leetcode-cn.com/problems/number-of-islands/
  本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。

2、问题解决

  笔者以C++方式解决。

  1. #include "iostream"
  2. using namespace std;
  3. #include "algorithm"
  4. #include "vector"
  5. #include "queue"
  6. #include "set"
  7. #include "map"
  8. #include "string"
  9. #include "stack"
  10. class Solution {
  11. private:
  12. // 标志某个节点是否访问过 即访问数组
  13. // 例如: dp[1][2] 代表 节点 (1,2)是否访问过
  14. vector<vector<char>> dp;
  15. // 定义节点上下左右移动,防止写的时候混乱
  16. vector<int> X = { 0, 0, -1, 1 };
  17. vector<int> Y = { 1, -1, 0, 0 };
  18. public:
  19. int numIslands(vector<vector<char>> &grid) {
  20. // 如果二维网格为空,说明没有大陆
  21. if (grid.empty()) {
  22. return 0;
  23. }
  24. // 初始化访问数组为 0
  25. dp.resize(grid.size());
  26. for (int i = 0; i < grid.size(); ++i) {
  27. dp[i].resize(grid[i].size());
  28. }
  29. // 定义大陆数量
  30. int num = 0;
  31. // 遍历整个网格
  32. for (int i = 0; i < grid.size(); ++i) {
  33. for (int j = 0; j < grid[i].size(); ++j) {
  34. // 如果是陆地并且没有访问过
  35. if (grid[i][j] == '1' && dp[i][j] == 0) {
  36. // 通过深搜将在一起的陆地连接起来
  37. dfs(grid, i, j);
  38. // 将陆地访问 + 1
  39. num++;
  40. }
  41. }
  42. }
  43. return num;
  44. }
  45. /** * 从节点 (i,j) 开始,将和(i,j) 属于同一块大陆的都标志成访问过 * @param grid * @param i * @param j */
  46. void dfs(vector<vector<char>> &grid, int i, int j) {
  47. // 递归边界直接返回
  48. if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size()) {
  49. return;
  50. }
  51. // 如果访问过 或者 不是陆地 直接返回
  52. if (dp[i][j] == 1 || grid[i][j] == '0') {
  53. return;
  54. }
  55. // 设置访问标志位为访问过
  56. dp[i][j] = 1;
  57. // 上下左右移动,进行递归标记
  58. for (int k = 0; k < 4; ++k) {
  59. dfs(grid, i + X[k], j + Y[k]);
  60. }
  61. }
  62. };
  63. int main() {
  64. // vector<vector<char>> grid = { { '1', '1', '1', '1', '0' },
  65. // { '1', '1', '0', '1', '0' },
  66. // { '1', '1', '0', '0', '0' },
  67. // { '0', '0', '0', '0', '0' } };
  68. vector<vector<char>> grid = { { '1','1','0','0','0' },
  69. { '1','1','0','0','0' },
  70. { '0','0','1','0','0' },
  71. { '0','0','0','1','1' } };
  72. Solution *pSolution = new Solution;
  73. int i = pSolution->numIslands(grid);
  74. cout << i << endl;
  75. system("pause");
  76. return 0;
  77. }

运行结果

在这里插入图片描述
有点菜,有时间再优化一下。

3、总结

  难得有时间刷一波LeetCode, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!

发表评论

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

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

相关阅读

    相关 200. 岛屿数量

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

    相关 leetcode200. 岛屿数量

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

    相关 leetcode.200岛屿数量

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

    相关 LeetCode200. 岛屿数量

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