首页 > 其他分享 >LeetCode -- 827. 最大人工岛

LeetCode -- 827. 最大人工岛

时间:2023-08-10 20:22:57浏览次数:36  
标签:ny -- ++ find nx int grid 827 LeetCode

 

 

题目大意:给一个邻接矩阵,问改变一个点后,最大连通块多大

对于这种连通块相关问题,一般的思路就是进行深搜和并查集,这里采用并查集维护连通块大小解法。

首先先初始化并查集,并进行连通块的合并;再对图中的0进行枚举,找到最大的连通块即可。

对(n * m)的二维点阵图常用技巧,二维转一维:点(i, j)对应的一维节点:i * m + j。

class Solution {
public:
    int n, m;
    vector<int> p, sz;

    int find(int x) {
        if(x != p[x]) p[x] = find(p[x]);
        return p[x];
    }

    int get(int i, int j) {
        return i * m + j;
    }

    int dx[4] = {-1, 0, 1, 0};
    int dy[4] = {0, 1, 0, -1};

    int largestIsland(vector<vector<int>>& grid) {
        n = grid.size(), m = grid[0].size();

        for(int i = 0; i < n * m; i ++ ) {
            p.push_back(i);
            sz.push_back(1);
        }

        int res = 1;
        for(int i = 0; i < n; i ++ ) {
            for(int j = 0; j < m; j ++ ) {
                if(grid[i][j]) {
                    int a = get(i, j);
                    for(int k = 0; k < 4; k ++ ) {
                        int nx = i + dx[k], ny = j + dy[k];
                        if(nx < 0 || nx >= n || ny < 0 || ny >= m || !grid[nx][ny]) continue;
                        int b = get(nx, ny);
                        if(find(a) != find(b)) {
                            sz[find(b)] += sz[find(a)];
                            p[find(a)] = find(b);
                        }
                    }
                    res = max(res, sz[find(a)]);
                }
            }
        }

        for(int i = 0; i < n; i ++ ) {
            for(int j = 0; j < m; j ++ ) {
                if(!grid[i][j]) {
                    map<int, int> mp;
                    for(int k = 0; k < 4; k ++ ) {
                        int nx = i + dx[k], ny = j + dy[k];
                        if(nx < 0 || nx >= n || ny < 0 || ny >= m || grid[nx][ny]) continue;
                        int a = get(nx, ny);
                        mp[find(a)] = sz[find(a)];
                    }
                    int s = 1;
                    for(auto &[k, v]: mp) {
                        s += v;
                    }
                    res = max(res, s);
                }
            }
        }
        
        return res;
    }
};

 

标签:ny,--,++,find,nx,int,grid,827,LeetCode
From: https://www.cnblogs.com/zk6696/p/17621419.html

相关文章

  • CF1848F
    [CF1848F]VikaandWikishaber题没想出来,紫砂了。这种题的经典方法是考虑贡献,注意到顺着想贡献不容易我们倒过来想,设\(f_{i,j}\)表示\(i\)轮后\(j\)的大小,则\(f_{i,j}=\operatorname{xor}\limits_{k\in[0,i]}\binom{i}{k}\bmod2\\timesa_{(j+k)\bmodn}\)。然后......
  • 在Java中操作Redis_Spring Data Redis使用方式_环境搭建
        ......
  • stm32 HAL UART DMA 发送
    MCU STM32H743IIT6     constuint8_tTEXT_TO_SEND[]={"ALIENTEKApolloSTM32H7DMA"};constuint8_tTEXT_TO_SEND2[]={"helloworld!"};externUART_HandleTypeDefhuart1;intmain(void){/*USERCODEBEGIN1*//*USERCODE......
  • 高效综艺新闻类字幕——基本图形
    这个是缩放,但是不推荐这样子去调整描边,阴影什么的都可以去调然后在之后就可以直接用这样子一个样式了......
  • 第五周总结
    第三周总结:本周我在暑假期间继续进行了以下工作:我花费了大约30小时的时间进行学习。本周的学习主要集中在Web开发和大数据技术框架上。我深入学习了Web开发的核心概念,包括前端开发技术(如HTML、CSS、JavaScript)和后端开发技术(如Django框架)。此外,我还进行了大数据技术框架的学习,包......
  • Python模块之paramiko的基本使用
    简介paramiko是一个基于SSHv2协议的纯Python(2.7,3.4+)库;提供了客户端和服务器的功能;可以实现SSH2远程安全连接,支持认证和密钥方式;一般用于执行远程命令、传输文件、中间SSH代理等。paramiko可以在Python代码中直接使用SSH协议对远程服务器进行操作,而不是调用ssh命令对远程服......
  • 在Java中操作Redis_Spring Data Redis使用方式_操作步骤说明
        ......
  • C++/嵌入式八股学习-day3
    目录C++/嵌入式八股学习-day3C/C++使用指针传递大容量参数如何禁止程序自动生成拷贝构造函数?final和override关键字C++类内可以定义引用数据成员吗?auto关键字成员函数里memset(this,0,sizeof(*this))会发生什么ARMSPIz总线的工作频率ARM内部传输数据的总线有哪些?IIC时钟拉伸应用编......
  • js中,import type 和 import 的区别?
    在JavaScript中,特别是在TypeScript和Flow类型系统中,importtype与import有一些重要的区别。 **importtype** importtype是TypeScript和Flow中特有的语法,它允许你导入类型而不导入运行时的值。这通常用于导入类型定义,例如接口、类型别名或类类型。这种导入方......
  • 简历投递记录
    1.8.1投麦可思技术支持实习,8.7线下笔试,基础SQL,感觉位置太偏,没有接着面试2.8.1柠檬微趣web前端正式批,牛客moka笔试,纯八股,微算法,没过3.联想Java开发,测试,前端(实习),Java24校招,纯泡池子4.8.8苏州青颖飞帆,Java24校招,已笔试,等结果5.招银网科,后端开发24校招,待筛选6.多益网络,初筛过,有毁......