FloodFill(洪水灌溉)算法专题——DFS深搜篇

目录

1、图像渲染

1.1 算法原理

1.2 算法代码

2、岛屿数量

2.1 算法原理

2.2 算法代码

3、岛屿的最大面积

3.1 算法原理

3.2 算法代码

4、被围绕的区域

4.1 算法原理

 4.2 算法代码

5、太平洋大西洋水流问题

5.1 算法原理

5.2 算法代码

6、扫雷游戏

6.1 算法原理

6.2 算法代码

7、衣橱整理 (原:面试题 13. 机器人的运动范围 )

7.1 算法原理

7.2 算法代码


1、图像渲染

. - 力扣(LeetCode)

1.1 算法原理

  • 从(sr,sc)位置开始上下左右暴搜,将区域中符合条件的值修改为color。
  • 细节问题:当 color == image[sr][sc]时,不需修改,直接返回即可。

1.2 算法代码

class Solution {
    int[] dx, dy;
    int[][] image;
    int color;
    int n, m;
    int val;
    public int[][] floodFill(int[][] image_, int sr, int sc, int color_) {
        if(color_ == image_[sr][sc]) return image_;
        image = image_;
        val = image[sr][sc];
        color = color_;
        n = image.length;
        m = image[0].length;
        dx = new int[]{-1, 1, 0, 0};
        dy = new int[]{0, 0, -1, 1};
        image[sr][sc] = color;
        dfs(sr, sc);
        return image;
    }
    public void dfs(int i, int j) {
        for(int k = 0; k < 4; k++) {
            int x = i + dx[k];
            int y = j + dy[k];
            if(x >= 0 && x < n && y >= 0 && y < m && image[x][y] == val) {
                image[x][y] = color;
                dfs(x, y);
            }
        }
    }
}

2、岛屿数量

. - 力扣(LeetCode)

2.1 算法原理

全局变量:

  1. boolean[][] check;//是否来过
  2. int ret;//返回值
  3. int[] dx;//横坐标上下左右
  4. int[] dy;//纵坐标上下左右

思想:

  • 遍历矩阵,每次来到新的'1'区域,将这个区域中的所有'1'位置做好标记(check置为false),ret++
  • 返回ret

2.2 算法代码

class Solution {
    int[] dx = {1, -1, 0, 0};
    int[] dy = {0, 0, 1, -1};
    boolean[][] check;
    int ret;
    int m, n;
    public int numIslands(char[][] grid) {
        m = grid.length;
        n = grid[0].length;
        check = new boolean[m][n];
        for(int i = 0; i < m ; i++) {
            for(int j = 0; j < n; j++) {
                if(check[i][j] == false && grid[i][j] == '1') {
                    ret++;
                    check[i][j] = true;
                    dfs(grid, i, j);
                }
            }
        }
        return ret;
    }
    public void dfs(char[][] grid, int i, int j) {
        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 && grid[x][y] == '1' && !check[x][y]) {
                check[x][y] = true;
                dfs(grid, x, y);
            }
        }
    }
}

3、岛屿的最大面积

. - 力扣(LeetCode)

3.1 算法原理

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值