IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C练题笔记之:Leetcode-827. 最大人工岛 -> 正文阅读

[数据结构与算法]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,就是当前这块地如果填平之后新大陆的面积。而我们只需要存储这个新大陆的最大值就好。

代码:

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;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:52:38  更:2022-09-21 00:56:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 20:33:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码