• Leetcode 827. 最大人工岛(连通块)


    827. 最大人工岛

    难度困难83

    在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地。

    进行填海之后,地图上最大的岛屿面积是多少?(上、下、左、右四个方向相连的 1 可形成岛屿)

    示例 1:

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

    示例 2:

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

    示例 3:

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

    说明:

    • 1 <= grid.length = grid[0].length <= 50
    • 0 <= grid[i][j] <= 1

    假hard题。搜一遍每个连通块的大小,同时求出来每个点所属的连通块的编号。然后遍历每个0,把其邻接的上下左右四个点所属的连通块(注意编号相同的连通块只能算一个,可以用set去重)的大小加起来再加上1然后用这个值更新答案即可。注意数据范围得开大一点,50的上界貌似是假的。

    class Solution {
    public:
        int n, a[550][550];
        int cnt = 0, belong[550][550];//块个数,所属联通块编号
        int sz[550 * 550];//块大小
        int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        int maxx = 0;
        void dfs(int x, int y, int id) {
            belong[x][y] = id;
            sz[id]++;//当前块大小++
            maxx = max(maxx, sz[id]);
            for(int i = 0; i < 4; i++) {
                int nx = x + d[i][0], ny = y + d[i][1];
                if(belong[nx][ny] || nx > n || nx < 1 || ny > n || ny < 1 || a[nx][ny] == 0) continue;
                dfs(nx, ny, id);
            }
        }
        int largestIsland(vector<vector<int>>& grid) {
            n = grid.size();
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    a[i + 1][j + 1] = grid[i][j];
                }
            }
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    if(a[i][j] == 1 && !belong[i][j]) {
                        cnt++;
                        dfs(i, j, cnt);
                    }
                }
            }
            int ans = 0;
            for(int x = 1; x <= n; x++) {
                for(int y = 1; y <= n; y++) {
                    if(a[x][y] == 1) continue;
                    int tmp_ans = 0;
                    set<int> s;
                    for(int k = 0; k < 4; k++) {
                        int nx = x + d[k][0], ny = y + d[k][1];
                        if(nx > n || nx < 1 || ny > n || ny < 1 || a[nx][ny] == 0 || s.find(belong[nx][ny]) != s.end()) continue;
                        tmp_ans += sz[belong[nx][ny]];
                        s.insert(belong[nx][ny]);
                    }
                    ans = max(ans, tmp_ans + 1);//别忘记加上反转后的
                }
            }
            ans = max(ans, maxx);
            return ans;
        }
    };
    
  • 相关阅读:
    部门创建注意问题
    我的技术博客开通啦~
    听侯钟雷老师的讲座,确认了几个问题。
    Dynamics CRM 批量添加用户时,报错:Server was unable to process request.
    汉字的Unicode范围(转)
    转载:Apache1.1 post请求无body的bug
    转载:Android有效解决加载大图片时内存溢出的问题
    2.2之前的webkit crash问题
    转载:Expect:100Continue & HTTP 417 Expectation
    城市旅游问题
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14640953.html
Copyright © 2020-2023  润新知