【广度优先搜索】FloodFill算法: 图像渲染,岛屿数量,岛屿的最大面积,被围绕的区域

文章目录

参考DFS解决FloodFill问题

1. 图像渲染(LC733)

图像渲染

题目描述

解题思路

从起点向四个方向,类似层序遍历,一层一层开始搜索

代码实现

java 复制代码
class Solution {
    public int[][] floodFill(int[][] image, int sr, int sc, int color) {
        int prev = image[sr][sc];
        if(prev == color)
            return image;

        int m = image.length;
        int n = image[0].length;
        int[] dx = {1,-1,0,0};
        int[] dy = {0,0,1,-1};

        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{sr,sc});
        while(!queue.isEmpty()){
            int[] top = queue.poll();
            int i = top[0];
            int j = top[1];
            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<m && y>= 0 && y<n && image[x][y]==prev)
                    queue.offer(new int[]{x,y});
            }
        }
        return image;
    }
}

2. 岛屿数量(LC200)

岛屿数量

题目描述

代码实现

java 复制代码
class Solution {
    public int numIslands(char[][] grid) {
        Queue<int[]> queue = new LinkedList<>();
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] check = new boolean[m][n];
        int ret = 0;

        int[] dx = {1,-1,0,0};
        int[] dy = {0,0,1,-1};
        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(!check[i][j] && grid[i][j] == '1'){
                    ret++;
                    check[i][j] = true;
                    queue.offer(new int[]{i,j});
                    while(!queue.isEmpty()){
                         int[] top = queue.poll();
                        int ii = top[0];
                        int jj = top[1];
                        for(int k = 0;k<4;k++){
                            int x = ii+dx[k];
                            int y = jj+dy[k];
                            if(x>=0 && x<m && y>=0 && y<n && !check[x][y] && grid[x][y]=='1'){
                                queue.offer(new int[]{x,y});
                                check[x][y] = true;
                            }
                        }
                    }
                }
            }
        }
        return ret;
    }
}

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

岛屿的最大面积

题目描述

代码实现

java 复制代码
class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] check = new boolean[m][n];
        int[] dx = {0,0,1,-1};
        int[] dy = {1,-1,0,0};
        int ret = 0;

        Queue<int[]> queue = new LinkedList<>();
        for(int i = 0;i<m;i++){
            for(int j=0;j<n;j++){
                if(!check[i][j] && grid[i][j]==1){
                    check[i][j] = true;
                    queue.offer(new int[]{i,j});

                    int area = 1;
                    while(!queue.isEmpty()){
                        int[] top = queue.poll();
                        int ii = top[0];
                        int jj = top[1];
                        
                        for(int k = 0;k<4;k++){
                            int x = ii + dx[k];
                            int y = jj + dy[k];

                            if(x>=0 && x<m && y>=0 && y<n && !check[x][y] && grid[x][y] ==1){
                                queue.offer(new int[]{x,y});
                                check[x][y] = true;
                                area++;
                            }
                        }
                    }
                    ret = Math.max(ret,area);
                }
            }
        }
        return ret;
    }
}

4. 被围绕的区域(LC130)

被围绕的区域

题目描述

解题思路

由于边界的O难处理,可以先遍历边界,对边界进行广度优先遍历,修改为'.',接着对数组进行遍历,如果遇到'O'可以直接修改为'x';遇到'.'可以直接修改为'O'

代码实现

java 复制代码
class Solution {
    Queue<int[]> queue = new LinkedList();
    int m,n;
    int[] dx = {0,0,1,-1};
    int[] dy = {1,-1,0,0};

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

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

        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(board[i][j]=='O')
                    board[i][j] = 'X';
                if(board[i][j] =='.')
                    board[i][j] = 'O';
            }
        }
    }
    
    void bfs(char[][] board,int i, int j){
        queue.offer(new int[]{i,j});
        board[i][j] = '.';
        while(!queue.isEmpty()){
            int[] top = queue.poll();
            int ii = top[0];
            int jj = top[1];
            for(int k = 0;k<4;k++){
                int x = ii +dx[k];
                int y = jj +dy[k];
                if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='O'){
                    board[x][y]='.';
                    queue.offer(new int[]{x,y});
                }
            }
        }
    }
}
相关推荐
KaMeidebaby15 小时前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
8Qi816 小时前
LeetCode 235. 二叉搜索树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·二叉搜索树·lca·迭代
bIo7lyA8v16 小时前
算法稳定性分析中的随机扰动建模的技术8
算法
科研online17 小时前
基于多源数据和XGBoost-SHAP分析中国大陆绿地碳汇空间变异影响因素的非线性相关性与尺度差异
算法·学习方法
Cthy_hy17 小时前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法
三品吉他手会点灯17 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
VkN2X2X4b18 小时前
算法复杂度的实验验证与误差分析的技术8
算法
其利天下技术18 小时前
风扇灯无刷电机自适应算法实战指南
算法·cocos2d·无刷电机自适应算法·bldc驱动自适应算法·其利无刷电机驱动算法
8Qi818 小时前
LeetCode 494:目标和(Target Sum)—— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
hujinyuan2016018 小时前
2026年3月 中国电子学会青少年软件编程(Python)三级考试试卷 真题及答案
java·python·算法