• 286被围绕的区域 · Surrounded Regions


    [抄题]:

    给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满。

    样例

    给出二维矩阵:

    X X X X
    X O O X
    X X O X
    X O X X
    

    把被 'X' 围绕的区域填充之后变为:

    X X X X
    X X X X
    X X X X
    X O X X

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    1. 找四周都是平原的盆地感觉不好找:可以尝试逆向思维,找开了口和外界有联系的盆地
    2. “注水”的过程通过图形化抽象后再用数学表达出来是bfs(其实感觉数学表达一共也就那么几种吧)
    3. 向四面八方扩展的数学表达是用dx dy数组,用过但是忘了

    [一句话思路]:

    python大法好。对边进行bfs, 能被水淹的则为空心。

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 数组测长度是用.length不加括号,我忘了
    2. bfs函数和主函数是分开的,两个完全不同的部分。之前我没注意
    3. bfs中,把当前一位拿出来后,把下一位设成W:board[nx][ny] = 'W';

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    棋盘图中的bfs,定义长、宽分别是m n

    [复杂度]:Time complexity: O(m*n) 每行每列都需要进行相互扩展 Space complexity: O(m+n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

    200. Number of Islands查并集

    water and gates

     [代码风格] :

    public class Solution {
        int n, m;
    
        public void solve(char[][] board) {
            // Write your code here
            n = board.length;
            if (n == 0) {
                return;
            }
            m = board[0].length;
    
            for (int i = 0; i < n; i++) {
                bfs(board, i, 0);
                bfs(board, i, m - 1);
            }
            for (int j = 0; j < m; j++) {
                bfs(board, 0, j);
                bfs(board, n - 1, j);
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (board[i][j] == 'W') {
                        board[i][j] = 'O';
                    } else {
                        board[i][j] = 'X';
                    }
                }
            }
        }
    
        void bfs(char[][] board, int sx, int sy) {
            if (board[sx][sy] != 'O') {
                return;
            }
            int[] dx = {0, 1, 0, -1};
            int[] dy = {1, 0, -1, 0};
    
            Queue<Integer> qx = new LinkedList<>();
            Queue<Integer> qy = new LinkedList<>();
            qx.offer(sx);
            qy.offer(sy);
            board[sx][sy] = 'W';                          // 'W' ->  Water
            while (!qx.isEmpty()) {
                int cx = qx.poll();
                int cy = qy.poll();
    
                for (int i = 0; i < 4; i++) {
                    int nx = cx + dx[i];
                    int ny = cy + dy[i];
                    if (0 <= nx && nx < n && 0 <= ny && ny < m
                            && board[nx][ny] == 'O') {
                        board[nx][ny] = 'W';              // 'W' ->  Water
                        qx.offer(nx);
                        qy.offer(ny);
                    }
                }
            }
        }
    }
    View Code
  • 相关阅读:
    【Django】Django REST Framework简单教程
    【SpringBoot | Druid】SpringBoot整合Druid
    【SpringBoot | Swagger】SpringBoot整合Swagger
    【Vue | ElementUI】Vue离开当前页面时弹出确认框实现
    【SpringBoot | Redis】SpringBoot整合Redis
    【评测机】评测时报错cc1plus: fatal error: /xx/xx/main.cpp: Permission denied compilation terminated.的解决方法
    Hello world!
    【续】将HUSTOJ备份数据并迁移至Ubuntu16.04
    将HUSTOJ备份数据并迁移至Ubuntu16.04
    【BZOJ2118】墨墨的等式【循环节做法】
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8453631.html
Copyright © 2020-2023  润新知