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

2023-11-03

题目:

给你一个大小为 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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C练题笔记之:Leetcode-827. 最大人工岛 的相关文章

随机推荐

  • 城市旅行【BZOJ 3091】【LCT】

    题目链接 很好的一次的debug的经验 来来回回的splay和rotate 眼花缭乱的一次次记录每次的实虚边所构成的多个splay的森林 题目求的是取一条链上的任意两个点构成的边的权值的期望 其实可以考虑成点被选取的次数乘以该点的权值 一条
  • 在Activity中显示Fragment

    在Activity中显示Fragment 还必须将Fragment提那家到Activity中 将Fragment添加到Activity有两种方式 在布局文件中使用
  • 【常见 error】Vivado 综合出现中断、失败、“PID not specified”

    目录 发现问题 解决历程 总结 发现问题 在对工程进行综合时 出现综合过程中出现中止或者完全不启动综合 类似下图 明明点击综合启动了几分钟 但是 elapsed 一直显示为 0 表示完全没用启动综合 在 TCL Console 栏中出现了
  • 作为新入职的Java程序员,完全看不懂公司代码,我只能...

    有人说JAVA工资高 待遇好这事是一个谣言 其实这并不是谣言 事实就是如此 最近在知乎上 看到一位蚂蚁金服的Java工程师分享 985硕士 校招就拿到了30w的offer 群内也有群友分享 自己通过三年的奋斗 终于年薪70w 这让很多同龄人
  • 如何在typora添加主题

    如何在typora添加主题 前言 总觉得Typora自带的主题不够华丽 那么我们来改造一下吧 环境准备 本文所使用到的环境信息如下 1 Typora版本1 0 5 6032 2 MacBook Pro 2015 catalina 10 15
  • 关于nginx日志出现大量no live upstreams while connecting to upstream

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 由于修改了upstream上的server配置 增加了max fails fail timeout weight这个三个参数项 导致nginx错误日志大量输出如下类型的错误
  • vue 表单确认密码 问题

    校验 confirmPwd required true validator rule value callback gt if this ruleForm confirmPwd callback new Error 请再次输入密码 else
  • JS拼table调整表格样式

    页面 table cellspacing 0 cellpadding 0 border 0 class layui table table 根据js选择器选择到table var bodyTag document getElementByI
  • [转]Nginx配置——反向代理

    文章目录 0 引言 1 何为反向代理 2 Nginx配置文件 2 1 第一部分 全局块 2 2 第二部分 events 块 2 3 第三部分 http 块 2 3 1 全局 server 块 2 3 2 location 块 3 反向代理如
  • java类到JVM执行的过程

    java类是如何到JVM执行的 本文是对 java文件到JVM运行的一个过程讲解 其中涉及到相关概念及原理 一 java类 类一般包含属性 代码块 构造器 方法 内部类 二 JDK JDK是java开发工具包 包括 bin db inclu
  • docker PostgreSQL 14.1 主从配置

    主库 IP 192 168 1 100 从库 IP 192 168 1 101 1 主从服务器装PostgreSQL 新建挂载目录 mkdir data postgres 拉取镜像 docker pull postgres 运行容器 doc
  • 项目管理之软件测试流程

    1 目的 对软件产品进行全面测试 以确保产品满足软件产品需求和业务需求 并最终通过测试 2 术语和定义 正式的迭代测试 制定测试方案 编写测试用例 至少2轮测试和1轮回归 简化的迭代测试 可以不输出测试方案 测试用例 只编写测试要点 至少1
  • java布尔表达式例子举例_java 逻辑表达式 布尔_使用基本逻辑门实现布尔表达式...

    java 逻辑表达式 布尔 将布尔表达式转换为逻辑电路 Converting Boolean Expression to Logic Circuit The simplest way to convert a Boolean express
  • 最短回文字符串python_在Python中查找按字典顺序最小的非回文字符串的程序

    假设我们有一个回文字符串s 我们必须更改一个字符 使s不再是回文 并且在字典上最小 因此 如果输入类似于s level 则输出将为 aevel 因为我们可以将第一个 l 更改为 a 以获得字典上最小的 不是回文的字符串 为了解决这个问题 我
  • OceanBase开发者大会震撼来袭

    国产之光 写在前面 打造开发者友好的分布式数据库 价值交换 写在最后 写在前面 这次OceanBase开发者大会是我第一次参加这样的大型技术会议 会议的规模很大 来自不同领域和不同行业的开发者都齐聚一堂 我感到非常激动和兴奋 作为一名开发者
  • leetcode 930. 和相同的二元子数组

    leetcode 930 和相同的二元子数组 给你一个二元数组 nums 和一个整数 goal 请你统计并返回有多少个和为 goal 的 非空 子数组 子数组 是数组的一段连续部分 示例 1 输入 nums 1 0 1 0 1 goal 2
  • 黄金矿工(小游戏)-----------C语言+easyx实现

    啥也不说 上代码 头文件 include
  • Oracle单表备份三种方案

    备份方案一 备份 create table 备份名 as select from 表名 恢复 truncate table org group insert into org group select from 备份名 说明 此种情况适用于
  • 正则表达式(JAVA)

    正则表达式 JAVA 文章目录 正则表达式 JAVA 用法 字符类 只匹配一个字符 预定义字符 只匹配一个字符 数量词 贪婪爬取 符号 捕获分组 规则 捕获分组 符号 非捕获分组 案例 忽略大小写 用法 正则表达式在用于校验信息是否满足某些
  • C练题笔记之:Leetcode-827. 最大人工岛

    题目 给你一个大小为 n x n 二进制矩阵 grid 最多 只能将一格 0 变成 1 返回执行此操作后 grid 中最大的岛屿面积是多少 岛屿 由一组上 下 左 右四个方向相连的 1 形成 示例 1 输入 grid 1 0 0 1 输出