FloodFill算法

文章目录

  • 1. 图像渲染(733)
  • 2. 岛屿数量(200)
  • 3. 岛屿的最大面积(695)
  • 4. 被围绕的区域(130)


1. 图像渲染(733)

题目描述:
在这里插入图片描述

算法原理:
根据题意我们需要将与最初选定的值相等的格子的值全部更改为指定的color值(包含最初选定的格子),这里我们就可以分为两种情况,第一种情况就是最初选定的格子中的值就是等于color值,那么我们就无需去操作了直接返回image数组;第二种情况就是color不等于最初选定的格子中的值,此时我们建立队列并且将最初的格子的坐标入队,然后沿着上下左右的方向进行发散,如果发散的坐标满足在数组内的条件并且值是等于最初选定的格子中的值,那么就将它的值改为color,然后不断地去循环,直至队列为空。
代码如下:

class Solution {
    public int[][] floodFill(int[][] image, int sr, int sc, int color) {
        int prev = image[sr][sc];
        if (prev == color) {
            return image;
        }

        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] { sr, sc });

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

        int m = image.length, n = image[0].length;

        while (!queue.isEmpty()) {
            int[] temp = queue.poll();
            int i = temp[0], j = temp[1];
            image[i][j] = color;
            for (int k = 0; k < 4; k++) {
                int x = i + dx[k], y = j + dy[k];
                if (x < m && x >= 0 && y >= 0 && y < n && image[x][y] == prev) {
                    queue.add(new int[] { x, y });
                }
            }
        }

        return image;

    }
}

题目链接

2. 岛屿数量(200)

题目描述:
在这里插入图片描述

算法原理:
这题实际上就是在上一题的基础上去加了循环遍历。首先我们去遍历数组,设定一个记录岛屿数量的变量ret,当我们遍历到数组元素等于1时的格子并且这个格子还未被扩散到时(是否扩散到由布尔类型数组记录),ret++,并且此时开始从这个坐标来从四个方向扩散,操作和上一题一样,后面的遍历的格子也是一样的操作。这样最终的ret就是记录的岛屿的数量,返回ret即可。
代码如下:

class Solution {
    int m, n;
    boolean[][] vis;
    int[] dx = { 0, 0, 1, -1 };
    int[] dy = { 1, -1, 0, 0 };

    public int numIslands(char[][] grid) {
        int ret = 0;
        m = grid.length;
        n = grid[0].length;

        vis = new boolean[m][n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == '1' && !vis[i][j]) {
                    bfs(grid, i, j);
                    ret++;
                }
            }
        }

        return ret;
    }

    public void bfs(char[][] grid, int i, int j) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] { i, j });
        vis[i][j] = true;
        while (!queue.isEmpty()) {
            int[] temp = queue.poll();
            int a = temp[0], b = temp[1];
            for (int k = 0; k < 4; k++) {
                int x = a + dx[k], y = b + dy[k];
                if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == '1') {
                    queue.add(new int[] { x, y });
                    vis[x][y] = true;
                }
            }
        }

    }
}

题目链接

3. 岛屿的最大面积(695)

题目描述:
在这里插入图片描述
算法原理:
这题和上一题的思路一致,只不过需要在bfs函数当中计算发散出的格子的个数并返回。
代码如下:

class Solution {
    int m, n;
    boolean[][] vis;
    int[] dx = { 1, -1, 0, 0 };
    int[] dy = { 0, 0, 1, -1 };

    public int maxAreaOfIsland(int[][] grid) {
        m = grid.length;
        n = grid[0].length;
        vis = new boolean[m][n];
        int ret = 0;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1 && !vis[i][j]) {
                    ret = Math.max(bfs(grid, i, j), ret);
                }
            }
        }

        return ret;
    }

    public int bfs(int[][] grid, int i, int j) {
        int ret = 1;
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] { i, j });
        vis[i][j] = true;

        while (!queue.isEmpty()) {
            int[] tmp = queue.poll();
            int a = tmp[0], b = tmp[1];
            for (int k = 0; k < 4; k++) {
                int x = a + dx[k], y = b + dy[k];
                if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1) {
                    queue.add(new int[] { x, y });
                    vis[x][y] = true;
                    ret++;
                }
            }

        }
        return ret;
    }
}

题目链接

4. 被围绕的区域(130)

题目描述:
在这里插入图片描述

算法原理:
我们发现要是像之前那样采用直接发散的做法是很困难的,因为发散的过程中肯定是要将’O’这样的格子给置为’X’,后面比如说我们碰到在数组边缘的’O’就很难处理了。所以我们正难则反,因为和数组边缘的’O’相连的’O’都是不需要去变为’X’的,所以我们先找一下数组中边缘部分的’O’,然后发散,将这些部分全部置为’Y’,之后我们再去遍历数组,碰到’O’就置为’X’,之后我们再将所有的’Y’还原回’O’,一下子简化问题。
代码如下:

class Solution {
    int m, n;
    int[] dx = { 1, -1, 0, 0 };
    int[] dy = { 0, 0, 1, -1 };

    public void solve(char[][] board) {
        m = board.length;
        n = board[0].length;

        for (int i = 0; i < n; i++) {
            if (board[0][i] == 'O') {
                bfs(board, 0, i);
            }
            if (board[m - 1][i] == 'O') {
                bfs(board, m - 1, i);
            }
        }

        for (int i = 1; i < m - 1; i++) {
            if (board[i][0] == 'O') {
                bfs(board, i, 0);
            }
            if (board[i][n - 1] == 'O') {
                bfs(board, i, n - 1);
            }
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                } else if (board[i][j] == 'Y') {
                    board[i][j] = 'O';
                }
            }
        }

    }

    public void bfs(char[][] board, int i, int j) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] { i, j });
        board[i][j] = 'Y';
        while (!queue.isEmpty()) {
            int[] tmp = queue.poll();
            int a = tmp[0], b = tmp[1];
            for (int k = 0; k < 4; k++) {
                int x = a + dx[k], y = b + dy[k];
                if (x >= 0 && x < m && y >= 0 && y < n&& board[x][y] == 'O') {
                    queue.add(new int[] { x, y });
                    board[x][y] = 'Y';
                }
            }
        }
    }
}

题目链接

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

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

相关文章

DAY13信息打点-Web 应用源码泄漏开源闭源指纹识别GITSVNDS备份

#知识点 0、Web架构资产-平台指纹识别 1、开源-CMS指纹识别源码获取方式 2、闭源-习惯&配置&特性等获取方式 3、闭源-托管资产平台资源搜索监控 演示案例&#xff1a; ➢后端-开源-指纹识别-源码下载 ➢后端-闭源-配置不当-源码泄漏 ➢后端-方向-资源码云-源码泄漏 …

1、https的全过程

目录 一、概述二、SSL过程如何获取会话秘钥1、首先认识几个概念&#xff1a;2、没有CA机构的SSL过程&#xff1a;3、没有CA机构下的安全问题4、有CA机构下的SSL过程 一、概述 https是非对称加密和对称加密的过程&#xff0c;首先建立https链接需要经过两轮握手&#xff1a; T…

算法提高模板强连通分量tarjan算法

AC代码&#xff1a; #include<bits/stdc.h>using namespace std;typedef long long ll; const int MOD 998244353; const int N 2e5 10;//强联通分量模板 //tarjan算法 vector<int>e[N]; int n, m, cnt; int dfn[N], low[N], ins[N], idx; int bel[N];//记录每…

Redis高可用,Redis性能管理

文章目录 一&#xff0c;Redis高可用&#xff0c;Redis性能管理二&#xff0c;Redis持久化1.RDB持久化1.1触发条件&#xff08;1&#xff09;手动触发&#xff08;2&#xff09;自动触发 1.2 Redis 的 RDB 持久化配置1.3 RDB执行流程(1) 判断是否有其他持久化操作在执行(2) 父进…

Chainlit集成Langchain并使用通义千问实现文生图网页应用

前言 本文教程如何使用通义千问的大模型服务平台的接口&#xff0c;实现图片生成的网页应用&#xff0c;主要用到的技术服务有&#xff0c;chainlit 、 langchain、 flux。合利用了大模型的工具选择调用能力。实现聊天对话生成图片的网页应用。 阿里云 大模型服务平台百炼 API…

R语言统计分析——功效分析3(相关、线性模型)

参考资料&#xff1a;R语言实战【第2版】 1、相关性 pwr.r.test()函数可以对相关性分析进行功效分析。格式如下&#xff1a; pwr.r.test(n, r, sig.level, power, alternative) 其中&#xff0c;n是观测数目&#xff0c;r是效应值&#xff08;通过线性相关系数衡量&#xff0…

NAT技术+代理服务器+内网穿透

NAT技术 IPv4协议中&#xff0c;会存在IP地址数量不充足的问题&#xff0c;所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的&#xff0c;而公网中的IP地址都是唯一的&#xff0c;所以NAT&#xff08;Network Address Translation&…

跨平台集成:在 AI、微服务和 Azure 云之间实现无缝工作流

跨平台集成在现代 IT 架构中的重要性 随着数字化转型的不断加速&#xff0c;对集成各种技术平台的需求也在快速增长。在当今的数字世界中&#xff0c;组织在复杂的环境中执行运营&#xff0c;其中多种技术需要无缝协作。环境的复杂性可能取决于业务的性质和组织提供的服务。具…

Windows更新之后任务栏卡死?桌面不断闪屏刷新?

前言 小白这几天忙于工作&#xff0c;更新就变得异常缓慢。但就算这么忙的情况下&#xff0c;晚上休息的时间还是会给小伙伴们提供咨询和维修服务。 这不&#xff0c;就有一个小伙伴遇到了个很奇怪的问题&#xff1a;电脑Windows更新之后&#xff0c;任务栏点了没反应&#xf…

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…

概念——二连杆与三连杆解算

https://zhuanlan.zhihu.com/p/161348413 跟着这位大佬学的&#xff0c;侵权删除 计划&#xff1a;先行理解概念以及推演过程&#xff0c;然后自行推导一遍&#xff08;确认理解&#xff09;&#xff0c;之后思考如何实际调用&#xff0c;目前在第一步 目录 01-二连杆 1-正…

腾讯云2024年数字生态大会开发者嘉年华(数据库动手实验)TDSQL-C初体验

在2024年9月5-6日&#xff0c;有幸参加了腾讯云举办的2024年数字生态大会开发者嘉年华。 有幸体验了腾讯的多项黑科技和云计算知识。特别是在“增一行代码”互动展区&#xff0c;体验了腾讯云云计算数据库TDSQL-C技术并进行了动手实验。这些技术充分展示了腾讯在云计算的强大实…

关于OceanBase 多模一体化的浅析

在当今多元化的业务生态中&#xff0c;各行各业对数据库系统的需求各有侧重。举例来说&#xff0c;金融风控领域对数据库的高效事务处理&#xff08;TP&#xff09;和分析处理&#xff08;AP&#xff09;能力有着严格要求&#xff1b;游戏行业则更加注重文档数据库的灵活性和性…

购物车装载状态检测系统源码分享

购物车装载状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

有关WSL和docker的介绍

目录标题 如何利用在windows上配置docker实现linux和windows容器修改WSL默认安装&#xff08;也就是linux子系统&#xff09;目录到其他盘 如何利用在windows上配置docker实现linux和windows容器 wsl的基本命令&#xff1a;参考网页 docker入门到实践&#xff1a;参考网页 官方…

tekton pipeline workspaces

tekton pipeline workspace是一种为执行中的管道及其任务提供可用的共享卷的方法。 在pipeline中定义worksapce作为共享卷传递给相关的task。在tekton中定义workspace的用途有以下几点: 存储输入和/或输出在task之间共享数据secret认证的挂载点ConfigMap中保存的配置的挂载点…

影刀RPA实战:自动化批量生成条形码完整指南

今天我们聊聊使用影刀来实现批量生成条形码&#xff0c;条形码在零售行业运用非常广泛&#xff0c;主要作用表现在产品识别&#xff0c;库存管理&#xff0c;销售管理&#xff0c;防伪保护等&#xff0c;这些作用使其成为现代商业和工业环境中不可或缺的工具&#xff0c;它极大…

力扣题/回溯/单词搜索

单词搜索 力扣原题 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那…

二叉树--

1.建立并遍历二叉树 遍历顺序&#xff1a; 先序遍历&#xff0c;中序遍历&#xff0c;后序遍历 先序&#xff1a;先根后左右 中序&#xff1a;先左然后根最后右 后序&#xff1a;先左右后根 例如&#xff1a; 先序&#xff1a;ABCDEFGH 中序&#xff1a;BDCEAFHG 后序&am…

JAVA基础:抽象类,接口,instanceof,类关系,克隆

1 JDK中的包 JDK JRE 开发工具集&#xff08;javac.exe&#xff09; JRE JVM java类库 JVM java 虚拟机 jdk中自带了许多的包&#xff08;类&#xff09; &#xff0c; 常用的有 java.lang 该包中的类&#xff0c;不需要引用&#xff0c;可以直接使用。 例如&#xff1…