算法学习(17)—— FloodFill算法

目录

关于FloodFill算法

部分OJ题详解

733. 图像渲染

200. 岛屿数量

695. 岛屿的最大面积

130. 被围绕的区域

417. 太平洋大西洋水流问题

529. 扫雷问题

LCR130. 衣橱整理


关于FloodFill算法

  • 爆搜,深搜,回溯的算法原理并不难,这类题目考察的就是我们的“代码能力”,就是我们能把思路转化为代码的能力
  • FloodFill算法解决的问题主要就是:“在一个有很多区域的矩阵中,找到性质相同的一个连通块”,做法也很简单,就是先遍历矩阵,当找到符合性质的第一个小区域时,对这个区域做一次深度优先遍历即可

部分OJ题详解

733. 图像渲染

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

给我们一个矩阵,然后又给了我们一个下标,要我们找到与这个下标的值相同的所有相邻的区域并把它们修改成另一个数color,下面来分析下这道题:

  • 解法很简单,就是从题目给我们的下标位置开始,上下左右依次做深度优先遍历即可,与我们上篇博客的解数独类题目类似,每次遍历后把符合要求的区域的值修改为color即可
  • 需要注意的是,如果原始颜色和目标颜色一样,就直接返回即可
class Solution 
{
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    int m, n;
    int prev; //存原始颜色
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) 
    {
        prev = image[sr][sc];
        m = image.size(), n = image[0].size();
        dfs(image, sr, sc, color);
        return image;
    }

    void dfs(vector<vector<int>>& image, int sr, int sc, int color)
    {
        if(image[sr][sc] == color) return;
        image[sr][sc] =  color;

        for(int k = 0; k < 4; k++)
        {
            int x = sr + dx[k], y = sc + dy[k];
            if((x >= 0 && y >= 0) && (x < m && y < n) && image[x][y] == prev)
            {
                dfs(image, x, y, color);
            }
        }
    }
};

200. 岛屿数量

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

题目给我们一个二维矩阵,由两个值填充,1表示陆地,0表示水,题目要我们找出有多少个陆地组成的岛屿,如示例二,有3个陆地;下面来分析下这道题

  • 这道题是FloodFill算法的一个应用,题目就是要我们找出所有相通区域的数量
  • 其实有了上篇博客大量的题目练习的基础,这道题其实不难,基础算法也是深度优先遍历,然后把每个遍历后的区域用一个bool vis[][] 标记一下即可,就和“单词搜索”那道题一样
  • class Solution 
    {
        vector<vector<bool>> vis;
        int dx[4] = {0, 0, -1, 1};
        int dy[4] = {1, -1, 0, 0};
        int m, n;
        int ret = 0;
    public:
        int numIslands(vector<vector<char>>& grid) 
        {
            m = grid.size(), n = grid[0].size();
            vis = vector<vector<bool>>(m, vector<bool>(n)); 
    
            for(int i = 0; i < m; i++)
            {
                for(int j = 0; j < n; j++)
                {
                    if(!vis[i][j] && grid[i][j] == '1')
                    {
                        ret++;
                        dfs(grid, i, j);
                    }
                }
            }
            return ret;
        }
        void dfs(vector<vector<char>>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值