岛屿的最大面积

约定不等于承诺〃 2023-02-19 09:26 138阅读 0赞

一、前言

问题来源LeetCode

问题链接:https://leetcode-cn.com/explore/interview/card/bytedance/243/array-and-sorting/1034/

二、题目

给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

示例 1:

  1. [[0,0,1,0,0,0,0,1,0,0,0,0,0],
  2. [0,0,0,0,0,0,0,1,1,1,0,0,0],
  3. [0,1,1,0,1,0,0,0,0,0,0,0,0],
  4. [0,1,0,0,1,1,0,0,1,0,1,0,0],
  5. [0,1,0,0,1,1,0,0,1,1,1,0,0],
  6. [0,0,0,0,0,0,0,0,0,0,1,0,0],
  7. [0,0,0,0,0,0,0,1,1,1,0,0,0],
  8. [0,0,0,0,0,0,0,1,1,0,0,0,0]]

对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。

示例 2:

  1. [[0,0,0,0,0,0,0,0]]

对于上面这个给定的矩阵, 返回 0。

注意: 给定的矩阵grid 的长度和宽度都不超过 50。

三、思路

用回溯法,简单直接

四、编码实现

  1. //==========================================================================
  2. /**
  3. * @file : 02_MaxAreaOfIsland.h
  4. * @blogs : https://blog.csdn.net/nie2314550441/article/details/106863629
  5. * @author : niebingyu
  6. * @title : 岛屿的最大面积
  7. * @purpose : 给定一个包含了一些 0 和 1 的非空二维数组 grid 。
  8. * 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
  9. * 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
  10. *
  11. * 示例 1:
  12. * [[0,0,1,0,0,0,0,1,0,0,0,0,0],
  13. * [0,0,0,0,0,0,0,1,1,1,0,0,0],
  14. * [0,1,1,0,1,0,0,0,0,0,0,0,0],
  15. * [0,1,0,0,1,1,0,0,1,0,1,0,0],
  16. * [0,1,0,0,1,1,0,0,1,1,1,0,0],
  17. * [0,0,0,0,0,0,0,0,0,0,1,0,0],
  18. * [0,0,0,0,0,0,0,1,1,1,0,0,0],
  19. * [0,0,0,0,0,0,0,1,1,0,0,0,0]]
  20. * 对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。
  21. *
  22. * 示例 2:
  23. * [[0,0,0,0,0,0,0,0]]
  24. * 对于上面这个给定的矩阵, 返回 0。
  25. * 注意: 给定的矩阵grid 的长度和宽度都不超过 50。
  26. *
  27. * 来源:力扣(LeetCode)
  28. * 链接:https://leetcode-cn.com/explore/interview/card/bytedance/243/array-and-sorting/1034/
  29. */
  30. //==========================================================================
  31. #pragma once
  32. #include <vector>
  33. #include <iostream>
  34. #include <algorithm>
  35. using namespace std;
  36. #define NAMESPACE_MAXAREAOFISLAND namespace NAME_MAXAREAOFISLAND {
  37. #define NAMESPACE_MAXAREAOFISLANDEND }
  38. NAMESPACE_MAXAREAOFISLAND
  39. class Solution
  40. {
  41. public:
  42. int maxAreaOfIsland(vector<vector<int>>& grid)
  43. {
  44. if (grid.empty() || grid[0].empty())
  45. return 0;
  46. // 这里按照题意给定的是矩形,不做校验
  47. int maxRet = 0;
  48. for (int i = 0; i < grid.size(); ++i)
  49. {
  50. for (int j = 0; j< grid[0].size(); ++j)
  51. {
  52. if (grid[i][j] == 1)
  53. {
  54. maxRet = max(maxRet, maxAreaOfIsland(grid, i, j));
  55. }
  56. }
  57. }
  58. return maxRet;
  59. }
  60. private:
  61. int maxAreaOfIsland(vector<vector<int>>& grid, int i, int j)
  62. {
  63. if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] != 1)
  64. return 0;
  65. // 这里按照题意给定的是矩形,不做校验
  66. int ret = 1;
  67. grid[i][j] = 2; //2 标记为已经访问
  68. static int dir[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };
  69. for (int k = 0; k < 4; ++k)
  70. {
  71. int ix = i + dir[k][0];
  72. int jx = j + dir[k][1];
  73. if (ix >= 0 && ix < grid.size() && jx >= 0 && jx < grid[0].size())
  74. {
  75. ret += maxAreaOfIsland(grid, ix, jx);
  76. }
  77. }
  78. return ret;
  79. }
  80. };
  81. //
  82. // 测试 用例 START
  83. void test(const char* testName, vector<vector<int>>& grid, int expect)
  84. {
  85. Solution S;
  86. int result = S.maxAreaOfIsland(grid);
  87. // 粗略校验
  88. if (result == expect)
  89. cout << testName << ", solution passed." << endl;
  90. else
  91. cout << testName << ", solution failed. result:" << result << " ,expect:" << expect << endl;
  92. }
  93. // 测试用例
  94. void Test1()
  95. {
  96. vector<vector<int>> grid =
  97. {
  98. {0,0,0,0,0,0,0,0}
  99. };
  100. int expect = 0;
  101. test("Test1()", grid, expect);
  102. }
  103. void Test2()
  104. {
  105. vector<vector<int>> grid =
  106. {
  107. {0,1},
  108. {1,1},
  109. };
  110. int expect = 3;
  111. test("Test2()", grid, expect);
  112. }
  113. void Test3()
  114. {
  115. vector<vector<int>> grid =
  116. {
  117. {1,1,1},
  118. {1,0,1},
  119. };
  120. int expect = 5;
  121. test("Test3()", grid, expect);
  122. }
  123. void Test4()
  124. {
  125. vector<vector<int>> grid =
  126. {
  127. {0,0,0},
  128. {0,1,1},
  129. };
  130. int expect = 2;
  131. test("Test4()", grid, expect);
  132. }
  133. void Test5()
  134. {
  135. vector<vector<int>> grid =
  136. {
  137. {0,0,1,0,0,0,0,1,0,0,0,0,0},
  138. {0,0,0,0,0,0,0,1,1,1,0,0,0},
  139. {0,1,1,0,1,0,0,0,0,0,0,0,0},
  140. {0,1,0,0,1,1,0,0,1,0,1,0,0},
  141. {0,1,0,0,1,1,0,0,1,1,1,0,0},
  142. {0,0,0,0,0,0,0,0,0,0,1,0,0},
  143. {0,0,0,0,0,0,0,1,1,1,0,0,0},
  144. {0,0,0,0,0,0,0,1,1,0,0,0,0}
  145. };
  146. int expect = 6;
  147. test("Test5()", grid, expect);
  148. }
  149. NAMESPACE_MAXAREAOFISLANDEND
  150. // 测试 用例 END
  151. //
  152. void MaxAreaOfIsland_Test()
  153. {
  154. NAME_MAXAREAOFISLAND::Test1();
  155. NAME_MAXAREAOFISLAND::Test2();
  156. NAME_MAXAREAOFISLAND::Test3();
  157. NAME_MAXAREAOFISLAND::Test4();
  158. NAME_MAXAREAOFISLAND::Test5();
  159. }

执行结果:

20200619205834710.png

发表评论

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

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

相关阅读

    相关 695. 岛屿面积

    > 给定一个包含了一些 0 和 1 的非空二维数组 grid 。 > > 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者

    相关 695. 岛屿面积

    给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着