• C练题笔记之:Leetcode-827. 最大人工岛


    题目:

    给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。

    返回执行此操作后,grid 中最大的岛屿面积是多少?

    岛屿 由一组上、下、左、右四个方向相连的 1 形成。

    示例 1:

    输入: grid = [[1, 0], [0, 1]]
    输出: 3
    解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。
    示例 2:

    输入: grid = [[1, 1], [1, 0]]
    输出: 4
    解释: 将一格0变成1,岛屿的面积扩大为 4。
    示例 3:

    输入: grid = [[1, 1], [1, 1]]
    输出: 4
    解释: 没有0可以让我们变成1,面积依然为 4。
     

    提示:

    n == grid.length
    n == grid[i].length
    1 <= n <= 500
    grid[i][j] 为 0 或 1

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

    结果:

      

    解题思路:

    先通过dfs(深度优先)查找出每一个已有陆地。给每一个已有的陆地标号。并计算出每一个记号的陆地大小。然后循环空地,将四周陆地连接之后的面积最大者取出。

    1、由于我们grid的标记是0和1组成,因此标号就从2开始。

    2、当我们循环到grid [ i ] [ j ] 为1的时候,说明我们遇到了新大陆,于是gridNumIndex (大陆编号)+1,开始深度查找。

    3、深度查找的时候要做两件事:1:将当前大陆标号,也就是在grid上将gridNum标上去;2:将当前大陆的面积计算出来。也就是又一个1 就加1.

    4、最后遍历grid,当当前标号为0的时候计算上下左右四面有没有大陆,其大陆编号记录下来。并且对大陆编号去重。

    5、将四周的大陆编号对应的面积相加再+1,就是当前这块地如果填平之后新大陆的面积。而我们只需要存储这个新大陆的最大值就好。

    代码:

    1. int getCount2Map(int **grid, int gridSize, int index, int colIndex, int griNum)
    2. {
    3. int count = 0;
    4. // 往下查找
    5. for (int i = index; i < gridSize; i++) {
    6. if (grid[i][colIndex] != 1) {
    7. break;
    8. }
    9. grid[i][colIndex] = griNum;
    10. count++;
    11. // 往右查找
    12. for (int j = colIndex + 1; j < gridSize; j++) {
    13. if (grid[i][j] != 1) {
    14. break;
    15. }
    16. // 每个节点再次向四周查找
    17. count += getCount2Map(grid, gridSize, i + 1, j, griNum);
    18. grid[i][j] = griNum;
    19. }
    20. // 往左查找
    21. for (int j = colIndex - 1; j >= 0; j--) {
    22. if (grid[i][j] != 1) {
    23. break;
    24. }
    25. // 每个节点再次向四周查找
    26. count += getCount2Map(grid, gridSize, i + 1, j, griNum);
    27. grid[i][j] = griNum;
    28. }
    29. }
    30. // 往上查找
    31. for (int i = index - 1; i >= 0; i--) {
    32. if (grid[i][colIndex] != 1) {
    33. break;
    34. }
    35. grid[i][colIndex] = griNum;
    36. count++;
    37. // 往右查找
    38. for (int j = colIndex + 1; j < gridSize; j++) {
    39. if (grid[i][j] != 1) {
    40. break;
    41. }
    42. // 每个节点再次向四周查找
    43. count += getCount2Map(grid, gridSize, i + 1, j, griNum);
    44. grid[i][j] = griNum;
    45. }
    46. // 往左查找
    47. for (int j = colIndex - 1; j >= 0; j--) {
    48. if (grid[i][j] != 1) {
    49. break;
    50. }
    51. // 每个节点再次向四周查找
    52. count += getCount2Map(grid, gridSize, i + 1, j, griNum);
    53. grid[i][j] = griNum;
    54. }
    55. }
    56. return count;
    57. }
    58. int largestIsland(int** grid, int gridSize, int* gridColSize){
    59. *gridColSize = 1;
    60. int griNum[20000] = {0}; // 存储已有的每一个小岛面积
    61. int griNumIndex = 1; // 存储已有小岛个数(为了和原有的0和1分开,从2开始计算。第一块小岛标记为2.
    62. // 将连接的块注释为同一个岛屿号,同时记录该岛屿有多少块
    63. for (int i = 0; i < gridSize; i++) {
    64. for (int j = 0; j < gridSize; j++) {
    65. if (grid[i][j] != 1) {
    66. continue;
    67. }
    68. griNumIndex++;
    69. griNum[griNumIndex] = getCount2Map(grid, gridSize, i, j, griNumIndex);
    70. }
    71. }
    72. // 循环空地, 将连接后的最大数量计算
    73. int max = 0;
    74. for (int i = 0; i < gridSize; i++) {
    75. for (int j = 0; j < gridSize; j++) {
    76. if (grid[i][j] != 0) {
    77. continue;
    78. }
    79. int upGriNum = i == 0 ? 0 : grid[i - 1][j];
    80. int downGriNum = i == gridSize - 1 ? 0 : grid[i + 1][j];
    81. int leftGriNum = j == 0 ? 0 : grid[i][j - 1];
    82. int rightGriNum = j == gridSize - 1 ? 0 : grid[i][j + 1];
    83. if (downGriNum == upGriNum) {
    84. downGriNum = 0;
    85. }
    86. if (leftGriNum == upGriNum || leftGriNum == downGriNum) {
    87. leftGriNum = 0;
    88. }
    89. if (rightGriNum == upGriNum || rightGriNum == leftGriNum || rightGriNum == downGriNum) {
    90. rightGriNum = 0;
    91. }
    92. int count = griNum[upGriNum] + griNum[downGriNum] + griNum[leftGriNum] + griNum[rightGriNum] + 1;
    93. max = max >= count ? max : count;
    94. }
    95. }
    96. if (max == 0) {
    97. return gridSize * gridSize;
    98. }
    99. return max;
    100. }

  • 相关阅读:
    (仿牛客社区项目)Java开发笔记7.9:优化网站的性能
    C#,搜索无向无权连通图(Undirected Unweighted Graph)的简单环(Simple Cycle)的算法与源代码
    面试官:你先回去等通知吧!这个 Java 岗位我还有机会吗?
    经典卷积神经网络 - ResNet
    多方位解析 C 端、B 端产品特性
    Apollo 应用与源码分析:CyberRT-时间相关API
    这些调试API技巧你熟悉吗?
    【SA8295P 源码分析 (二)】110 - OpenWFD Display 美信加串器 MAX96783 - 解串器 MAX96774 初始化寄存器详解
    java计算机毕业设计企业客户管理系统源码+mysql数据库+系统+lw文档+部署
    记录近期修复Dataguard的过程
  • 原文地址:https://blog.csdn.net/lingjinyue/article/details/126920136