zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux下的inode记录
    Linux中如何使用gThumb批量调整图片大小
    U盘安装Linux安装报错及解决方案
    在Mysql中如何显示所有用户?
    【转】PowerDesigner中Table视图同时显示Code和Name
    【转】正则表达式-贪婪与非贪婪匹配
    【转】程序员书籍
    Oracle 分页、取期间数据、TOP前几
    数字信封理解
    【转】C# 利用反射动态创建对象
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8453631.html
Copyright © 2011-2022 走看看