力扣连通图问题详解

1.主要思路

采用深度优先遍历,以该点为中心,按照顺时针或者逆时针的方式,遍历其上下左右节点,同时辅以标记数组,遍历过的要做以标记

2.例题

1.图像渲染

class Solution {
    int[][] image;
    int target;
    public int[][] floodFill(int[][] image, int sr, int sc, int color) {
        this.image=image;
        this.target=image[sr][sc];
        if(this.target==color){
            return this.image;
        }
        dfs(sr,sc,color);
        return this.image;
    }
    public void dfs(int sr,int sc,int color){
        if(sr<0||sr>=image.length||sc<0||sc>=image[0].length){
            return;
        }
        if(image[sr][sc]!=target){
            return;
        }
        image[sr][sc]=color;
        dfs(sr+1,sc,color);
        dfs(sr,sc-1,color);
        dfs(sr-1,sc,color);
        dfs(sr,sc+1,color);
    }
}

2.边界着色

class Solution {
    int[][] grid;
    int color;
    int curColor;
    boolean[][] used;
    public int[][] colorBorder(int[][] grid, int row, int col, int color) {
        this.grid=grid;
        this.used=new boolean[this.grid.length][this.grid[0].length];
        this.color=color;
        this.curColor=grid[row][col];
        if(this.color==this.curColor){
            return this.grid;
        }
        dfs(row,col);
        return this.grid;
    }

    public void dfs(int row,int col){
        if(row<0||col<0||row>=grid.length||col>=grid[0].length){
            return;
        }

        if(used[row][col]||grid[row][col]!=this.curColor){
            return;
        }

        if(row==0||col==0||row==grid.length-1||col==grid[0].length-1){
            grid[row][col]=color;
        }else if(test(row,col)){
                grid[row][col]=color;
                

        }
        used[row][col]=true;
            dfs(row+1,col);
            dfs(row,col-1);
            dfs(row-1,col);
            dfs(row,col+1);

    }

    public boolean test(int row,int col){
        if(grid[row+1][col]!=curColor&&!used[row+1][col]){
            return true;
        }
        if(grid[row][col+1]!=curColor&&!used[row][col+1]){
            return true;
        }
        if(grid[row-1][col]!=curColor&&!used[row-1][col]){
            return true;
        }
        if(grid[row][col-1]!=curColor&&!used[row][col-1]){
            return true;
        }
        return false;
    }
}

3.岛屿数量

class Solution {
    boolean[][] used;
    char[][] grid;
    public int numIslands(char[][] grid) {
        this.grid=grid;
        this.used=new boolean[this.grid.length][this.grid[0].length];
        int count=0;
        for (int i = 0; i < this.grid.length; i++) {
            for (int j = 0; j < this.grid[0].length; j++) {
                if(!this.used[i][j]&&this.grid[i][j]=='1'){
                    count++;
                    dfs(i,j);
                }
            }
        }
        return count;
    }
    
    public void dfs(int x,int y){
        if(x<0||y<0||x>=this.grid.length||y>=this.grid[0].length){
            return;
        }
        if(this.grid[x][y]=='0'||this.used[x][y]){
            return;
        }
        this.used[x][y]=true;
        dfs(x+1,y);
        dfs(x,y-1);
        dfs(x-1,y);
        dfs(x,y+1);
    }
}

4.飞地的数量

class Solution {
    boolean flag;
    boolean[][] used;
    int[][] grid;
    public int numEnclaves(int[][] grid) {
        this.grid=grid;
        this.used=new boolean[grid.length][grid[0].length];
        int count=0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if(this.grid[i][j]==1&&!used[i][j]){
                    flag=true;
                    int r=dfs(i,j);
                    if(flag){
                        count+=r;
                    }
                }
            }
        }
        return count;
    }

    public int dfs(int x,int y){
        if(x<0||y<0||x>=grid.length||y>=grid[0].length){
            return 0;
        }
        if(grid[x][y]==0||used[x][y]){
            return 0;
        }
        if(x==0||y==0||x== grid.length-1||y== grid[0].length-1){
            flag=false;
        }
        used[x][y]=true;
        int i1=dfs(x+1,y);
        int i2=dfs(x,y-1);
        int i3=dfs(x-1,y);
        int i4=dfs(x,y+1);
        if(flag){
            return i1+i2+i3+i4+1;
        }else{
            return 0;
        }
    }
}

5.统计封闭岛屿的数目

class Solution {
    boolean flag;
    boolean[][] used;
    int[][] grid;
    public int closedIsland(int[][] grid) {
        this.grid=grid;
        this.used=new boolean[grid.length][grid[0].length];
        int count=0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if(this.grid[i][j]==0&&!used[i][j]){
                    flag=true;
                    dfs(i,j);
                    if(flag){
                        count++;
                    }
                }
            }
        }
        return count;
    }

    public void dfs(int x,int y){
        if(x<0||y<0||x>=grid.length||y>=grid[0].length){
            return;
        }
        if(grid[x][y]==1||used[x][y]){
            return;
        }
        if(x==0||y==0||x== grid.length-1||y== grid[0].length-1){
            flag=false;
        }
        used[x][y]=true;
        dfs(x+1,y);
        dfs(x,y-1);
        dfs(x-1,y);
        dfs(x,y+1);
    }
}

6.被围绕的区域

class Solution {
    char[][] board;
    boolean[][] used;
    boolean flag;
    Set<int[]> set=new HashSet<>();
    public void solve(char[][] board) {
        this.board=board;
        this.used=new boolean[board.length][board[0].length];
        for (int i = 0; i < this.board.length; i++) {
            for (int j = 0; j < this.board[0].length; j++) {
                if(this.board[i][j]=='O'&&!used[i][j]){
                    flag=true;
                    dfs(i,j);
                    if(flag){
                        for (int[] ints : set) {
                            this.board[ints[0]][ints[1]]='X';
                        }
                    }
                    set.clear();
                }
            }
        }
    }

    public void dfs(int x,int y){
        if(x<0||y<0||x>=board.length||y>=board[0].length){
            return;
        }
        if(used[x][y]||this.board[x][y]=='X'){
            return;
        }
        if(x==0||y==0||x==board.length-1||y==board[0].length-1){
            flag=false;
        }
        used[x][y]=true;
        set.add(new int[]{x,y});
        dfs(x+1,y);
        dfs(x,y-1);
        dfs(x-1,y);
        dfs(x,y+1);
    }
}

7.统计子岛屿

class Solution {
    boolean[][] used1;
    boolean[][] used2;
    int[][] grid1;
    int[][] grid2;
    boolean flag;
    public int countSubIslands(int[][] grid1, int[][] grid2) {
        this.grid1=grid1;
        this.used1=new boolean[this.grid1.length][this.grid1[0].length];
        for (int i = 0; i < grid1.length; i++) {
            for (int j = 0; j < grid1[0].length; j++) {
                if(!used1[i][j]&&this.grid1[i][j]==1){
                    dfs1(i,j);
                }
            }
        }
        this.grid2=grid2;
        int count=0;
        this.used2=new boolean[this.grid2.length][this.grid2[0].length];
        for (int i = 0; i < grid2.length; i++) {
            for (int j = 0; j < grid2[0].length; j++) {
                if(!used2[i][j]&&this.grid2[i][j]==1){
                    flag=true;
                    dfs2(i,j);
                    if(flag){
                        count++;
                    }
                }
            }
        }
        return count;
    }

    public void dfs1(int x,int y){
        if(x<0||y<0||x>=grid1.length||y>=grid1[0].length){
            return;
        }
        if(used1[x][y]||grid1[x][y]==0){
            return;
        }
        used1[x][y]=true;
        dfs1(x+1,y);
        dfs1(x,y-1);
        dfs1(x-1,y);
        dfs1(x,y+1);
    }
    public void dfs2(int x,int y){
        if(x<0||y<0||x>=grid2.length||y>=grid2[0].length){
            return;
        }
        if(used2[x][y]||grid2[x][y]==0){
            return;
        }
        used2[x][y]=true;
        if(x< grid1.length&&y<grid1[0].length&&!used1[x][y]){
            flag=false;
        }
        dfs2(x+1,y);
        dfs2(x,y-1);
        dfs2(x-1,y);
        dfs2(x,y+1);
    }
}

8.岛屿的最大面积

class Solution {
    boolean flag;
    boolean[][] used;
    int[][] grid;
    public int maxAreaOfIsland(int[][] grid) {
        this.grid=grid;
        this.used=new boolean[grid.length][grid[0].length];
        int count=0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if(this.grid[i][j]==1&&!used[i][j]){
                    int r=dfs(i,j);
                    count=Math.max(count,r);
                }
            }
        }
        return count;
    }

    public int dfs(int x,int y){
        if(x<0||y<0||x>=grid.length||y>=grid[0].length){
            return 0;
        }
        if(grid[x][y]==0||used[x][y]){
            return 0;
        }
        used[x][y]=true;
        int i1=dfs(x+1,y);
        int i2=dfs(x,y-1);
        int i3=dfs(x-1,y);
        int i4=dfs(x,y+1);
        return i1+i2+i3+i4+1;
    }
}

9.最大人工岛

这道题比较难

class Solution {
    static int[] d = {0, -1, 0, 1, 0};

    public int largestIsland(int[][] grid) {
        int n = grid.length, res = 0;
        int[][] tag = new int[n][n];
        Map<Integer, Integer> area = new HashMap<Integer, Integer>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1 && tag[i][j] == 0) {
                    int t = i * n + j + 1;
                    area.put(t, dfs(grid, i, j, tag, t));
                    res = Math.max(res, area.get(t));
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 0) {
                    int z = 1;
                    Set<Integer> connected = new HashSet<Integer>();
                    for (int k = 0; k < 4; k++) {
                        int x = i + d[k], y = j + d[k + 1];
                        if (!valid(n, x, y) || tag[x][y] == 0 || connected.contains(tag[x][y])) {
                            continue;
                        }
                        z += area.get(tag[x][y]);
                        connected.add(tag[x][y]);
                    }
                    res = Math.max(res, z);
                }
            }
        }
        return res;
    }

    public int dfs(int[][] grid, int x, int y, int[][] tag, int t) {
        int n = grid.length, res = 1;
        tag[x][y] = t;
        for (int i = 0; i < 4; i++) {
            int x1 = x + d[i], y1 = y + d[i + 1];
            if (valid(n, x1, y1) && grid[x1][y1] == 1 && tag[x1][y1] == 0) {
                res += dfs(grid, x1, y1, tag, t);
            }
        }
        return res;
    }

    public boolean valid(int n, int x, int y) {
        return x >= 0 && x < n && y >= 0 && y < n;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/890857.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用可白嫖的高配置服务器——DAMODEL进行AI开发教程

DAMODEL&#xff1a;DAMODEL 目前DAmodel注册并实名赠送50大洋的免费额度&#xff0c;搭载4090的服务器费用不到2r/h 教程&#xff1a; 完成注册并实名后 在此点击创建实例 选择实例配置 选择镜像&#xff0c;看你使用哪种dl框架 。 实例自带的磁盘会随实例释放。需要自己…

FineReport 图表切换维度

1、导入数据 可以参考导入Excel数据&#xff0c;直接导入数据也可以在数据库建表&#xff0c;Navicat直接导入数据 以下是数据库建表操作 -- 创建表 create table test11 ( orderTime date NULL, -- 下单时间 quantity int NULL -- 数量 ); 导入数据 2、SQL判断统计维度…

Docker 的数据管理

前置资源 Docker的数据管理资源.zip资源-CSDN文库 一、容器中数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容…

2024 年 Mac 下这些生产力工具,好用到哭

每段关系最终都会结束 即使不是因为别的原因 也会因为死亡 我只知道 你不对她说出来 她就永远不知道 你的心意 她那天离开的时候 才知道一个道理 有时候 保护一样重要的东西的方式 不是守在她旁边 而是离开她 离得远远的远到看起来谁也 不在乎谁一样 今天呢&#x…

Go-知识泛型

Go-知识泛型 1. 认识泛型1.1 不使用泛型1.2 使用泛型 2. 泛型的特点2.1 函数泛化2.2 类型泛化 3. 类型约束3.1 类型集合3.2 interface 类型集合3.2.1 内置interface类型集合3.2.2 自定义interface类型集合3.2.2.1 任意类型元素3.2.2.2 近似类型元素3.2.2.3 联合类型元素 3.2.3 …

Linux网络命令:用于配置防火墙规则的一个用户友好的工具ufw详解

目录 一、概述 二、安装 UFW 三、启动、重启和关闭 UFW 1、启动 2、关闭UFW 3、 重启 UFW 四、查看 UFW 状态 五、UFW 基本命令 1. 允许端口 &#xff08;1&#xff09;单个 TCP 端口 &#xff08;2&#xff09;允许单个 UDP 端口 &#xff08;3&#xff0…

音频响度归一化 - python 实现

在处理音频样本时&#xff0c;往往我们的音频样本由于录制设备&#xff0c;环境&#xff0c;人发音的音量大小的不同影响&#xff0c;会造成音频响度不统一&#xff0c;分布在一个不同的响度值域上。为了让语音模型更好的学习音频特征&#xff0c;就有必要对音频的响度进行归一…

【AIGC】ChatGPT是如何思考的:探索CoT思维链技术的奥秘

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;什么是CoT思维链CoT思维链的背景与技术发展需求 &#x1f4af;CoT思维链的工作原理&#x1f4af;CoT思维链的应用领域&#x1f4af;CoT思维链的优势&#x1f4af;CoT思维…

ppt压缩文件怎么压缩?压缩PPT文件的多种压缩方法

ppt压缩文件怎么压缩&#xff1f;当文件体积过大时&#xff0c;分享和传输就会变得困难。许多电子邮件服务对附件的大小有限制&#xff0c;而在网络环境不佳时&#xff0c;上传和下载大文件可能耗时较长。此外&#xff0c;在不同设备上播放时&#xff0c;较大的PPT文件还可能导…

基于Java+SpringBoot+Uniapp的博客系统设计与实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

<OS 有关> Windows 11 对不习惯菜单所做修改 自用

新安装 Windows 11 23H2 不习惯菜单&#xff0c;做的修改&#xff1a; 1. 禁用 Show More Options 鼠标右键 想使用旧版的 鼠标右键菜单&#xff0c; 不需要点 show more options , 如下图的方式&#xff1a; 创建一个 注册表文件&#xff1a; disable_content.reg Windows …

Maven 高级之分模块设计与继承、聚合

在软件开发中&#xff0c;随着项目规模的扩大&#xff0c;代码量和复杂度不断增加&#xff0c;传统的一体化开发模式逐渐暴露出诸多问题。为了解决这些问题&#xff0c;模块化开发应运而生&#xff0c;而 Maven 正是模块化开发的利器&#xff0c;它提供的继承和聚合机制为构建和…

STL源码剖析:STL算法

STL 算法总览 质变算法 mutating algorithms—会改变操作对象之值 所有的 STL算法都作用在由迭代器(first,last)所标示出来的区间上。所谓“质变算法”,是指运算过程中会更改区间内(迭代器所指)的元素内容。诸如拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remov…

【H2O2|全栈】更多关于HTML(2)HTML5新增内容

目录 HTML5新特性 前言 准备工作 语义化标签 概念 新内容 案例 多媒体标签 音频标签audio 视频标签 video 新增部分input表单属性 预告和回顾 后话 HTML5新特性 前言 本系列博客是对入门专栏的HTML知识的补充&#xff0c;并伴随一些补充案例。 这一期主要介绍H…

一文区分SSTI 和 CSTI

前言 有时&#xff0c;SSTI&#xff08;服务器端模板注入&#xff09;和 CSTI&#xff08;客户端模板注入&#xff09;可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell&#xff0c;即使payload仅限于客户端。 定义 &#x1d…

电汽车充电革命:充电桩的过去现在与未来

电动汽车充电革命&#xff1a;中国充电桩行业的过去、现在与未来 一、发展历程概述 中国充电桩行业的发展历程可划分为以下几个阶段&#xff1a; 1. 初始期&#xff08;2006-2008年&#xff09;&#xff1a;在此阶段&#xff0c;国家队主导市场&#xff0c;主要参与者包括国…

linux的学习第二天

1.vmware的功能&#xff1a; 快照 创建快照&#xff1a; 拍摄此虚拟机的快照&#xff1a;记录保存虚拟机的当前状态&#xff0c;如果系统出现故障&#xff0c;可以通过快照还原&#xff08;错删系统时可以找到快照的系统状态&#xff0c;然后恢复系统&#xff09; 恢复快照…

基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

如何替换OCP节点(一):使用oat | OceanBase应用实践

前言&#xff1a; OceanBase Cloud Platform&#xff08;简称OCP&#xff09;&#xff0c;是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中&#xff0c;OCP的安装通常是第一步&#xff0c;先搭建OCP平台&#xff0c;进而依赖OCP来创建、管理和监控我们的生…

Spark全网最全总结

Spark 产生之前&#xff0c;已经有 MapReduce 这类非常成熟的计算系统存在了&#xff0c;并提供 了高层次的 API(map/reduce)&#xff0c;把计算运行在集群中并提供容错能力&#xff0c;从而实现 分布式计算。 虽然 MapReduce 提供了对数据访问和计算的抽象&#xff0c…