floodfill算法(洪水灌溉算法)

news2024/10/11 10:22:49

一)floodfill算法简介:

二)图像渲染

733. 图像渲染 - 力扣(LeetCode)

class Solution {
    int[] dx = {1, 0, 0, -1};
    int[] dy = {0, 1, -1, 0};
    //上下搜索的时候要使用向量数组
    int row=0;
    int col=0;
    int target=0;
    public void dfs(int[][] image,int i,int j,int color){
        if(image[i][j]==target){
             image[i][j]=color;
        }
        for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
            if(x>=0&&x<row&&y>=0&&y<col&&image[x][y]==target){
                //四个方向进行深度优先遍历
                   dfs(image,x,y,color);
            }
        }
    }
public int[][] floodFill(int[][] image, int i, int j, int color) {
       if(color==image[i][j]) return image;//防止走到重复元素的情况
       this.target=image[i][j];
       this.row=image.length;
       this.col=image[0].length;
       dfs(image,i,j,color);
       return image;
    }
}

三)岛屿数量

200. 岛屿数量 - 力扣(LeetCode)

class Solution {
    public boolean[][] check;
    int[] dx = {1, 0, 0, -1};
    int[] dy = {0, 1, -1, 0};
    int row=0;
    int col=0;
    public void dfs(char[][] array,int i,int j){
         check[i][j]=true;
        for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&array[x][y]=='1'&&check[x][y]==false){
               check[x][y]=true;
               dfs(array,x,y);
           }
        }
    }
    public int numIslands(char[][] array) {
        this.row=array.length;
        this.col=array[0].length;
        this.check=new boolean[row][col];
        int ret=0;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(array[i][j]=='1'&&check[i][j]==false){
                    check[i][j]=true;
                      ret++;
                    dfs(array,i,j);
                }
            }
        }
    return ret;
    }
}

四)岛屿的最大面积:

​​​​​​695. 岛屿的最大面积 - 力扣(LeetCode)

算法原理:

1)想要解决本题核心的思路还是做一次深度优先遍历,我们一开始来遍历这个岛屿,当扫描到一个陆地之后(这个数组的值等于1),就从这个陆地也就是1开始来做一次深度优先遍历,上下左右都来进行扫描

2)此时定义一个全局的变量count,在深度优先遍历,只要进入一次dfs,就让这个count++,因为在每一次进入到dfs函数的时候,都是相当于是进入到了一块陆地,档次是针对这个起始陆地深度优先遍历完成之后,此时的这个count值就是统计这块岛屿的面积,然后再使用ret统计最终的结果;

3)下面的写法是dfs带有返回值和dfs不带有返回值的写法:

class Solution {
    public boolean[][] check;
    int[] dx = {1, 0, 0, -1};
    int[] dy = {0, 1, -1, 0};
    int row=0;
    int col=0;
    int ret=0;
    int count=0;
    public void dfs(int[][] array,int i,int j){
          count++;
          for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&array[x][y]==1&&check[x][y]==false){
               check[x][y]=true;
               dfs(array,x,y);
           }
        }
    }
    public int maxAreaOfIsland(int[][] array) {
        this.row=array.length;
        this.col=array[0].length;
        this.check=new boolean[row][col];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(array[i][j]==1&&check[i][j]==false){
                    check[i][j]=true;
                    count=0;
                    dfs(array,i,j);
                    ret=Math.max(count,ret);
                }
            }
        }
    return ret;
    }
}
class Solution {
    public boolean[][] check;
    int[] dx = {1, 0, 0, -1};
    int[] dy = {0, 1, -1, 0};
    int row=0;
    int col=0;
    int ret=0;
    public int dfs(int[][] array,int i,int j){
          int count=1;
          for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
    if(x>=0&&x<row&&y>=0&&y<col&&array[x][y]==1&&check[x][y]==false){
               check[x][y]=true;
               count+=dfs(array,x,y);
           }
        }
    return count;
    }
    public int maxAreaOfIsland(int[][] array) {
        this.row=array.length;
        this.col=array[0].length;
        this.check=new boolean[row][col];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(array[i][j]==1&&check[i][j]==false){
                    check[i][j]=true;
                    ret=Math.max(dfs(array,i,j),ret);
                }
            }
        }
    return ret;
    }
}

五)被围绕的区域

130. 被围绕的区域 - 力扣(LeetCode)

算法原理:

1)首先遍历整个二维矩阵的边界,先找到边界区域的圆圈,先进行标记一下,那么剩下的圆圈自然就是在内部的圆圈,标记的时候可以搞一个check数组,也可以把边界的情况处理成一个额外字符

2)然后直接修改内部的圆圈;

class Solution {
    public boolean[][] check;
    public int row=0;
    public int col=0;
    int[] dx = {1, 0, 0, -1};
    int[] dy = {0, 1, -1, 0};
    public void dfs(char[][] board,int i,int j,char ch){
        check[i][j]=true;
        board[i][j]=ch;
        for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&board[x][y]=='O'&&check[x][y]==false){
               dfs(board,x,y,ch);
          }
        }

    }
    public void solve(char[][] board) {
//1.先进行初始化操作
        this.row=board.length;
        this.col=board[0].length;
        this.check=new boolean[row][col];
//2.进行处理边界情况下的O字符
        for(int i=0;i<col;i++){
            if(board[0][i]=='O'&&check[0][i]==false){
                dfs(board,0,i,'O');
            }
if(board[row-1][i]=='O'&&check[row-1][i]==false){
                dfs(board,row-1,i,'O');
            }
        }
        for(int j=0;j<row;j++){
            if(board[j][0]=='O'&&check[j][0]==false){
                dfs(board,j,0,'O');
            }
if(board[j][col-1]=='O'&&check[j][col-1]==false){
                dfs(board,j,col-1,'O');
            }
        }
      System.out.println(Arrays.deepToString(check));  
//3.开始处理非边界上的O
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            if(board[i][j]=='O'&&check[i][j]==false){
                dfs(board,i,j,'X');
            }
        }
    }
    }
}

六)太平洋大西洋水流问题

417. 太平洋大西洋水流问题 - 力扣(LeetCode)

解法1:直接来解决这个问题,直接进行遍历二维数组中的每一个点,直接判断某一个点是否能够到达太平洋也可以到达大西洋,但是可能会出现重复路径的情况,所以说时间有可能会超时

解法2:正难则反:反着看,假设太平洋或者是大西洋的水能够逆着来,能够走到哪些位置,直接看大于等于当前位置的位置此时我们枚举完成第一行和最后一行的所有元素,并且针对与这些所有元素全部做一次深度优先遍历,将所有能够流向大西洋的点进行标记

class Solution {
    List<List<Integer>> ret=new ArrayList<>();
    int row=0;
    int col=0;
    int[] dx = {1, 0, 0, -1};
    int[] dy = {0, 1, -1, 0};
    public void dfs(int[][] array,int i,int j,boolean[][] check){
        check[i][j]=true;
        for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&check[x][y]==false&&array[i][j]<=array[x][y]){
      dfs(array,x,y,check);

    }

        }


    }
    public List<List<Integer>> pacificAtlantic(int[][] array) {
        this.row=array.length;
        this.col=array[0].length;
        boolean[][] pac=new boolean[row][col];
        boolean[][] atc=new boolean[row][col];
//1.先处理太平洋
        for(int i=0;i<col;i++){
            dfs(array,0,i,pac);//处理上边界,上边界是找所有可能从大西洋从(i,j)方向逆流到哪一个位置
        }
        for(int j=0;j<row;j++){
            dfs(array,j,0,pac);//处理左边界
        }
//2.再来处理大西洋
        for(int i=0;i<col;i++){
            dfs(array,row-1,i,atc);//处理下边界
        }
        for(int j=0;j<row;j++){
            dfs(array,j,col-1,atc);//处理右边界,右边界是找所有可能从大西洋从(i,j)方向逆流到哪一个位置
        }
//3.最后进行提取结果
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(pac[i][j]==true&&atc[i][j]==true){
                    List<Integer> temp=new ArrayList<>();
                    temp.add(i);
                    temp.add(j);
                    ret.add(temp);
                }
            }
        }
//4.返回最终结果       
  return ret;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认识模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组 合、分解和更换的单元。 1. 现实生活中的模块化 2.编程领域中的模块化 编程领域中的模块化&#xff0c;…

教你如何快速阅读葡萄酒标签

我们经常被问及葡萄酒标签上写了什么&#xff0c;总体而言这些信息可以分为四个关键部分&#xff0c;第一品牌或生产商&#xff1b;第二国家或地区&#xff1b;第三葡萄品种&#xff1b;第四年份。 第一品牌或生产商&#xff0c;在寻找葡萄酒的制造商时&#xff0c;著名的品牌名…

手机充值的功能测试框架 - 测试要点

手机充值有微信营销活动的、有 APP 页面应用等&#xff0c;以下是我以前公司的手机充值话费或流量应用的测试要点&#xff0c;分享给大家参考下。 一、手机号码输入框检查 1、手机号码框要控制成只能输入11位数字的文本框。 2、输入以非1开头的手机号&#xff0c;给出提示&a…

第 2 章 线性表 (设立尾指针的单循环链表(链式存储结构)实现)

1. 背景说明 循环链表(circular linked list)&#xff0c;是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点&#xff0c; 整个链表形成一个环。由此&#xff0c;从表中任一结点出发均可找到表中其他结点 。 2. 示例代码 1) status.h /* DataStruct…

Parsing error: The keyword ‘const‘ is reserved

Parsing error: The keyword ‘const’ is reserved 在文件.eslintrc.js中 因为eslint默认审查的es5&#xff0c;需要明确让他审查es6.&#xff0c;所以需要配置parserOptions 配置如下: module.exports {"plugins": ["prettier"],"rules": {…

【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)

业务逻辑不能用http状态码判断&#xff0c;应该有自己的逻辑判断。想要前端需要判断&#xff08;好多if…else&#xff09;&#xff0c;所以需要标准化&#xff0c;标准化返回。 json标准化返回: 最外面&#xff1a;data,message,code三个字段。 data&#xff1a;返回的数据 co…

【Unity基础】2.网格材质贴图与资源打包

【Unity基础】2.网格材质贴图与资源打包 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;网格材质纹理 第一次接触3D物体的话&#xff0c;会觉得好神奇啊&#xff0c;这个物体究竟是由什么组…

教育志愿者的初心与担当

近日&#xff0c;有报道显示&#xff0c;在全球范围内&#xff0c;大约有6000万的儿童由于各种原因无法接受基础教育&#xff0c;其中非洲大陆的教育贫瘠现象尤为显著。然而&#xff0c;在这片土地上&#xff0c;有一位中国年轻志愿者Lily Zhu&#xff0c;以一种富有创新精神的…

Mysql中in和exists的区别 not in、not exists、left join的相互转换

文章目录 1. in 介绍1.1 in中数据量的限制1.2 null值不参与in或not in&#xff0c;也就是说in and not in 并不是全量值&#xff0c;排除了null值1.3 in的执行逻辑 2. exists介绍2.1 exists not exists 是全量数据2.2 exists的执行逻辑 3. 小表驱动大表的好处4. in、not in、e…

图像噪声--添加噪声

椒盐噪声 椒盐噪声就是给图片添加黑白噪点&#xff0c;椒指的是黑色的噪点(0,0,0),盐指的是白色的噪点(255,255,255)&#xff0c;通过num来控制噪声多少&#xff0c;值越大添加的噪声越多&#xff0c;图像损坏的更加严重。 void add_salt_pepper_noise(Mat& src,Mat& …

Mojo-SDK详细安装教程

Mojo-SDK安装 运行环境&#xff1a;windows11wsl2&#xff08;ubuntu1804&#xff09; 截至20230909&#xff0c;windows,mac系统暂时不支持 step1: Install VS Code, the WSL extension, and the Mojo extension. step2: Install Ubuntu 22.04 for WSL and open it. step…

Vue el-table 重置按钮设计模板

vue 文件演示模板 <template><el-button icon"el-icon-refresh" size"large" click"resetFunction">重置</el-button><el-tableheight"450"v-loading"loading":data"dataList":row-key&quo…

U盘插上就让格式化是坏了吗?数据怎么恢复

U盘插上就让格式化是坏了吗&#xff1f;当您遇到U盘插上后提示需要格式化的情况时&#xff0c;不要慌张。这种情况并不一定意味着U盘已经坏了。下面我们一起来了解下如何恢复里面的数据&#xff0c;并解决U盘提示格式化的问题。 U盘一插上就提示格式化是什么原因 许多人可能会有…

个人微信多账号聚合管理如何实现?

在日常工作中&#xff0c;您是否会遇到以下问题&#xff1a; 微信号多&#xff0c;需反复切换设备及账号&#xff0c;工作效率低。 无法快速响应客户消息&#xff0c;客户体验感差。 无法随时掌握员工与客户沟通情况&#xff0c;员工沟通质量难以控制&#xff0c;管理难。 员…

Spring系列文章:面向切面编程AOP

一、代理模式 1、代理模式使用场景引入 ⽣活场景1&#xff1a;⽜村的⽜⼆看上了隔壁村⼩花&#xff0c;⽜⼆不好意思直接找⼩花&#xff0c;于是⽜⼆找来了媒婆王妈妈。这 ⾥⾯就有⼀个⾮常典型的代理模式。⽜⼆不能和⼩花直接对接&#xff0c;只能找⼀个中间⼈。其中王妈妈是…

OpenCV 11(图像金字塔)

一、 图像金字塔 **图像金字塔**是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说, 图像金字塔是同一图像不同分辨率的子图集合. 图像金字塔最初用于机器视觉和图像压缩。其通过梯次向下采…

shell知识点复习

1、shell能做什么&#xff08; Shell可以做任何事(一切取决于业务需求) &#xff09; 自动化批量系统初始化程序 自动化批量软件部署程序 应用管理程序 日志分析处理程序 自动化备份恢复程序 自动化管理程序 自动化信息采集及监控程序 配合Zabbix信息采集 自动化扩容 2、获取当…

淘宝双11数据分析与预测课程案例中(林子雨)错误点总结

问题一&#xff1a;可视化代码中男女买家各个年龄段对比散点图中数值不显示以及坐标不正确问题如下图 解决方法&#xff1a; 1修改坐标 2修改数值 修改后散点图 问题二&#xff1a;各省份的总成交量对比中地图显示不出来 有时间再写

海量小文件传输对于企业选用文件传输软件的重要意义

在当前的商业环境中&#xff0c;数据具有极其重要的作用&#xff0c;是企业竞争的核心要素。随着互联网、物联网和云计算等技术的快速发展&#xff0c;数据的类型和规模变得越来越多样。在这其中&#xff0c;海量小文件作为一种普遍而重要的数据形式&#xff0c;扮演着连接信息…

新知同享 | Mobile 开发轻松跨屏,高效构建

谷歌致力于帮助开发者 更快、更轻松地打造高质量的移动体验 一起来看 2023 Google 开发者大会上 Mobile 开发值得重点关注的成果与更新 了解如何提高平台及应用质量 提升开发效率 使多设备开发体验更流畅 实现轻松跨屏&#xff0c;高效构建 精彩大会现场一览 用户对跨屏幕体验…