题目:

给你一个大小为 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,就是当前这块地如果填平之后新大陆的面积。而我们只需要存储这个新大陆的最大值就好。

代码:

int getCount2Map(int **grid, int gridSize, int index, int colIndex, int griNum)
{int count = 0;// 往下查找for (int i = index; i < gridSize; i++) {if (grid[i][colIndex] != 1) {break;}grid[i][colIndex] = griNum;count++;// 往右查找for (int j = colIndex + 1; j < gridSize; j++) {if (grid[i][j] != 1) {break;}// 每个节点再次向四周查找count += getCount2Map(grid, gridSize, i + 1, j, griNum);grid[i][j] = griNum;}// 往左查找for (int j = colIndex - 1; j >= 0; j--) {if (grid[i][j] != 1) {break;}// 每个节点再次向四周查找count += getCount2Map(grid, gridSize, i + 1, j, griNum);grid[i][j] = griNum;}}// 往上查找for (int i = index - 1; i >= 0; i--) {if (grid[i][colIndex] != 1) {break;}grid[i][colIndex] = griNum;count++;// 往右查找for (int j = colIndex + 1; j < gridSize; j++) {if (grid[i][j] != 1) {break;}// 每个节点再次向四周查找count += getCount2Map(grid, gridSize, i + 1, j, griNum);grid[i][j] = griNum;}// 往左查找for (int j = colIndex - 1; j >= 0; j--) {if (grid[i][j] != 1) {break;}// 每个节点再次向四周查找count += getCount2Map(grid, gridSize, i + 1, j, griNum);grid[i][j] = griNum;}}return count;
}
int largestIsland(int** grid, int gridSize, int* gridColSize){*gridColSize = 1;int griNum[20000] = {0}; // 存储已有的每一个小岛面积int griNumIndex = 1;            // 存储已有小岛个数(为了和原有的0和1分开,从2开始计算。第一块小岛标记为2.// 将连接的块注释为同一个岛屿号,同时记录该岛屿有多少块for (int i = 0; i < gridSize; i++) {for (int j = 0; j < gridSize; j++) {if (grid[i][j] != 1) {continue;}griNumIndex++;griNum[griNumIndex] = getCount2Map(grid, gridSize, i, j, griNumIndex);}}// 循环空地, 将连接后的最大数量计算int max = 0;for (int i = 0; i < gridSize; i++) {for (int j = 0; j < gridSize; j++) {if (grid[i][j] != 0) {continue;}int upGriNum = i == 0 ? 0 : grid[i - 1][j];int downGriNum = i == gridSize - 1 ? 0 : grid[i + 1][j];int leftGriNum = j == 0 ? 0 : grid[i][j - 1];int rightGriNum = j == gridSize - 1 ? 0 : grid[i][j + 1];if (downGriNum == upGriNum) {downGriNum = 0;}if (leftGriNum == upGriNum || leftGriNum == downGriNum) {leftGriNum = 0;}if (rightGriNum == upGriNum || rightGriNum == leftGriNum || rightGriNum == downGriNum) {rightGriNum = 0;}int count = griNum[upGriNum] + griNum[downGriNum] + griNum[leftGriNum] + griNum[rightGriNum] + 1;max = max >= count ? max : count;}}if (max == 0) {return gridSize * gridSize;}return max;
}

C练题笔记之:Leetcode-827. 最大人工岛相关推荐

  1. Leetcode 827. 最大人工岛 C++

    Leetcode 827. 最大人工岛 题目 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方 ...

  2. Leetcode 827.最大人工岛(Making A Large Island)

    Leetcode 827.最大人工岛 1 题目描述(Leetcode题目链接)   在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的 ...

  3. Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)

    827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...

  4. C练题笔记之:Leetcode-12. 整数转罗马数字

    题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符          数值 I             1 V             5 X             1 ...

  5. C练题笔记之:Leetcode-307. 区域和检索 - 数组可修改

    题目: 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的n ...

  6. C练题笔记之:Leetcode-303. 区域和检索 - 数组不可变

    题目: 给定一个整数数组  nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= rig ...

  7. C练题笔记之:Leetcode-662. 二叉树最大宽度

    题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 . 树的 最大宽度 是所有层中最大的 宽度 . 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度.将这个二叉树 ...

  8. C练题笔记之:Leetcode-793. 阶乘函数后 K 个零

    题目: f(x) 是 x! 末尾是 0 的数量.回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1 . 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 :而 ...

  9. C练题笔记之:Leetcode-654. 最大二叉树

    题目: 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在最大值 左边 的 子数组前缀上 构建左子 ...

最新文章

  1. python3之request用法_如何扩展python3 BaseHTTPRequestHandler类,以便可以使用成员variab调用函数...
  2. python工程师证书-【一个合格的Python工程师需要达到怎样的编程水平】
  3. 操作索引库-mapping属性
  4. pta 是否完全二叉搜索树_二叉树:构造一棵搜索树
  5. 有人说:轻量级锁一定比重量级锁快!我忍不住笑了
  6. 2020年中国便利店发展报告
  7. Java生成.jar库
  8. 新手请教个问题,有关cocos2d-x
  9. 【电脑运用及修理】连接不到网站服务器解决方案【win10】
  10. [线性相关] 皮尔森相关系数的计算及假设检验
  11. 海底捞无人餐厅上线,万人失业潮又要到来?
  12. android 自动剪裁图片,android使用系统裁剪图片
  13. 如何生成java dump文件
  14. 帝国时代3如何快速实现训练单位突破人口上限
  15. 用R写一个迷宫小游戏
  16. Sourcetree安装详细(最新版本)
  17. Symbol xxx multiply defined (by xxx1.o and xxx2.o).
  18. Thinkpad x230 登录黑屏故障排除
  19. CMfg-SC(云制造服务组合)、DRL、DQN的定义
  20. html div代码大全,DIV+CSS 常用代码大全

热门文章

  1. 几种生态廊道构建概念、方法和工具的本质比较
  2. nagios监控安装配置文档+139邮箱报警
  3. 漫画:为什么程序员没有女朋友?
  4. English语法_状语从句
  5. if-elif-e方法lse的基本使用
  6. 计算机随机数游戏抽卡,游戏抽卡概率设计:10连抽保底的概率模型
  7. java公众号上传素材及发送图文消息实现
  8. (趋势)The 2002 Trend Micro Programming Contest, Preliminary
  9. 支付宝小程序唤起独立签约
  10. hadoop的fs shell命令