LeetCode 0827. 最大人工岛

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0827. 最大人工岛相关的知识,希望对你有一定的参考价值。

【LetMeFly】827.最大人工岛

力扣题目链接:https://leetcode.cn/problems/making-a-large-island/

给你一个大小为 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]01

方法一:深搜

对原始地图进行一次深搜,将不同的“岛屿”(连通块)标记为不同的编号。

同时,用哈希表记录每个编号对应的“岛屿”的面积。

之后再遍历一遍地图,如果某个小方格为0,就尝试把这个方格填平。

若填平,则其及其连通岛屿的面积和为:自己的面积(1) + 四周相连岛屿的面积(去重后,根据编号,通过哈希表快速求出某块的面积)

更新答案最大值。

具体细节请参考代码注释。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n 2 ) O(n^2) O(n2)

AC代码

C++

typedef pair<int, int> point;
const int directions[4][2] = 0, 1, 0, -1, -1, 0, 1, 0;
class Solution 
public:
    int largestIsland(vector<vector<int>>& grid) 
        int numTo = 2;  // 将不同岛屿进行编号(从2号开始编)
        unordered_map<int, int> num2area;  // 岛屿编号 -> 此岛面积
        num2area[0] = 0;  // “0号编号”的岛屿面积为0(其实0号就是水)
        int n = grid.size();
        for (int i = 0; i < n; i++)   // 广搜开始
            for (int j = 0; j < n; j++) 
                if (grid[i][j] == 1)   // 新岛屿
                    int thisNum = numTo;  // 新岛屿的编号
                    numTo++;
                    int thisArea = 1;  // 新岛屿的面积
                    queue<point> points;  // 队列
                    points.push(i, j);
                    grid[i][j] = thisNum;
                    while (points.size())   // 不空时
                        point thisPoint = points.front();
                        points.pop();
                        for (int d = 0; d < 4; d++) 
                            int tx = thisPoint.first + directions[d][0];
                            int ty = thisPoint.second + directions[d][1];
                            if (tx >= 0 && tx < n && ty >= 0 && ty < n) 
                                if (grid[tx][ty] == 1) 
                                    grid[tx][ty] = thisNum;  // 同样编号
                                    points.push(tx, ty);  // 入队
                                    thisArea++;  // 面积+1
                                
                            
                        
                    
                    num2area[thisNum] = thisArea;  // 存入哈希表
                
            
        
        if (numTo == 2)  // 没有岛屿被编号,也就是说全都是水
            return 1;
        int ans = 0;
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < n; j++) 
                if (grid[i][j] == 0) 
                    unordered_set<int> nearby;  // 哈希表去重
                    for (int d = 0; d < 4; d++)   // 上下左右四周
                        int tx = i + directions[d][0];
                        int ty = j + directions[d][1];
                        if (tx >= 0 && tx < n && ty >= 0 && ty < n) 
                            nearby.insert(grid[tx][ty]);
                        
                    
                    int cnt = 1;
                    for (int num : nearby) 
                        cnt += num2area[num];
                    
                    ans = max(ans, cnt);
                
            
        
        return ans ? ans : n * n;  // 如果ans = 0,就说明本来就没有水。也就是说本来就全是陆地,因此岛屿面积为n^2
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126913736

以上是关于LeetCode 0827. 最大人工岛的主要内容,如果未能解决你的问题,请参考以下文章

面试热点题:DFS最大人工岛 一个没有那么难的的困难题

岛屿类问题的通用解法DFS 遍历框架

岛屿类问题的通用解法DFS 遍历框架

岛屿问题的最大面积 leetcode python

LeetCode 695. 岛屿的最大面积 (DFS)

leetcode695.岛屿的最大面积