zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    ubuntu 安装FoxitReader福昕阅读器(转载)
    添加中文字库
    操作系统常用调度算法(转载https://www.cnblogs.com/kxdblog/p/4798401.html)
    2802:小游戏利用bfs来实现
    2802:小游戏
    适合使用并行的一种bfs
    (转载)关于usr/bin/ld: cannot find -lxxx问题总结
    gcc5.4报错对‘std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()’未定义的引用
    centos7如何安装gcc5.4
    将含有makefile文件的源码加入Eclipse工程
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14640953.html
Copyright © 2011-2022 走看看