[算法基础] FooldFill(DFS、BFS)

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

DFS 完整代码:

java 复制代码
class Solution {
    int[][] grid;
    int rows;
    int columns;
    int area;

    public int maxAreaOfIsland(int[][] grid) {
        this.grid = grid;
        rows = grid.length;
        columns = grid[0].length;

        int maxArea = 0;

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (grid[i][j] == 1) {
                    dfs(i, j);
                    maxArea = Math.max(maxArea, area);
                    area = 0;
                }
            }
        }

        return maxArea;
    }

    private void dfs(int r, int c) {
        if (r < 0 || r >= rows || c < 0 || c >= columns
                || grid[r][c] != 1) {
            return;
        }

        grid[r][c] = 2;
        area++;

        dfs(r - 1, c);
        dfs(r + 1, c);
        dfs(r, c - 1);
        dfs(r, c + 1);
    }
}

BFS 完整代码:

java 复制代码
class Solution {
    int[][] grid;
    int rows;
    int columns;

    static class Pair {
        int row;
        int column;

        public Pair(int row, int column) {
            this.row = row;
            this.column = column;
        }
    }

    public int maxAreaOfIsland(int[][] grid) {
        this.grid = grid;
        rows = grid.length;
        columns = grid[0].length;

        int ret = 0;

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (grid[i][j] == 1) {
                    int area = bfs(new Pair(i, j));
                    ret = Math.max(ret, area);
                }
            }
        }

        return ret;
    }

    public int bfs(Pair pair) {
        int ret = 0;
        Queue<Pair> queue = new LinkedList<>();
        queue.add(pair);

        while (!queue.isEmpty()) {
            Pair temp = queue.poll();
            int r = temp.row;
            int c = temp.column;

            if (r < 0 || r >= rows || c < 0 || c >= columns
                    || grid[r][c] != 1) {
                continue;
            }

            grid[r][c] = 2;
            ret++;

            queue.add(new Pair(r - 1, c));
            queue.add(new Pair(r + 1, c));
            queue.add(new Pair(r, c - 1));
            queue.add(new Pair(r, c + 1));
        }

        return ret;
    }
}

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

正难则反。这道题要找所有被围绕的 O 区域,不太好找,因此我们可以先找那些不被围绕的 O 区域,这些区域是好找的,因为它们一定至少有一个坐标是位于矩阵边缘的。现在我们仅需探测矩阵的边缘即可,碰到 O 就 DFS 进去。

java 复制代码
class Solution {
    char[][] board;
    int rows;
    int columns;
    boolean[][] notSurrounded; // 记录所有不被围绕的区域为 true

    public void solve(char[][] board) {
        this.board = board;
        rows = board.length;
        columns = board[0].length;
        this.notSurrounded = new boolean[rows][columns];

        // 找上边缘和下边缘
        for (int i = 0; i < rows; i++) {
            if (board[i][0] == 'O') {
                dfs(i, 0);
            }
            if (board[i][columns - 1] == 'O') {
                dfs(i, columns - 1);
            }
        }

        // 找左边缘和右边缘
        for (int j = 1; j < columns - 1; j++) {
            if (board[0][j] == 'O') {
                dfs(0, j);
            }
            if (board[rows - 1][j] == 'O') {
                dfs(rows - 1, j);
            }
        }

        // 再次遍历,找被围绕区域
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (board[i][j] == 'O' && !notSurrounded[i][j]) {
                    board[i][j] = 'X';
                }
            }
        }
    }

    private void dfs(int r, int c) {
        // 坐标越界 || 不是 O || 该坐标已经走过
        if (r < 0 || r >= rows || c < 0 || c >= columns
                || board[r][c] != 'O' || notSurrounded[r][c]) {
            return;
        }

        notSurrounded[r][c] = true;

        dfs(r - 1, c);
        dfs(r + 1, c);
        dfs(r, c - 1);
        dfs(r, c + 1);
    }
}
相关推荐
变量未定义~9 分钟前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗12 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH20 分钟前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜22 分钟前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu30 分钟前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下41 分钟前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月1 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
To_OC9 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode