Surrounded Regions——LeetCode

Given a 2D board containing ‘X‘ and ‘O‘, capture all regions surrounded by ‘X‘.

A region is captured by flipping all ‘O‘s into ‘X‘s in that surrounded region.

For example,

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

After running your function, the board should be:

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

题目大意:给一个棋盘,上面有‘X‘和‘O‘,找出所有被‘X‘包围的‘O‘,并替换成‘X‘。

解题思路:

解法一:从边开始,找出在四条边上的O,以BFS的方式找出所有与边上的O连通的O,这些O都是不被包围的,将这些O替换为某个特殊字符,遍历完之后,将O替换为X,将特殊字符替换为O。

解法二:直接用BFS遍历,找到一个O之后,加入BFS队列,找出与之连通的所有的O同时判断这些O是否被包围(即是否位于某条边上),将这些O加入一个List,每一个连通的O区域用一个surround布尔变量表示这个连通区域是否是被surround的,如果是就把这些O替换为X,否则不替换并继续遍历其他。

注意:这里因为要把i、j下标放入队列或者结果集,一开始我使用String类型key= i+"_"+j 来处理,后来看到别人key = i * colLen + j ; colLen是棋盘的列的数量,然后用key/colLen,key%colLen来得到i,j下标效率更高。

Talk is cheap>>

解法一:

  public void solve(char[][] board) {
        Queue<Integer> queue = new ArrayDeque<>();
        int rowLen = board.length;
        if (rowLen == 0)
            return;
        int colLen = board[0].length;
        int[][] adj = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
        for (int i = 0; i < rowLen; i++) {
            for (int j = 0; j < colLen; j++) {          //如果O在四条边上
                if (board[i][j] == ‘O‘ && (i == 0 || j == 0 || i == rowLen - 1 || j == colLen - 1)) {
                    int key = i * colLen + j;
                    board[i][j] = ‘1‘;
                    queue.add(key);
                    while (!queue.isEmpty()) {              //BFS遍历与边上的O连通的O
                        key = queue.poll();
                        int x = key / colLen;
                        int y = key % colLen;
                        for (int k = 0; k < 4; k++) {
                            int adj_x = x + adj[k][0];
                            int adj_y = y + adj[k][1];
                            if (adj_x >= 0 && adj_y >= 0 && adj_x < rowLen && adj_y < colLen) {
                                if (board[adj_x][adj_y] == ‘O‘) {
                                    int pos = adj_x * colLen + adj_y;
                                    board[adj_x][adj_y]=‘1‘;
                                    queue.add(pos);
                                }
                            }
                        }
                    }
                }
            }
        }
        for (int i = 0; i < rowLen; i++) {
            for (int j = 0; j < colLen; j++) {
                if (board[i][j] == ‘O‘) {
                    board[i][j] = ‘X‘;
                } else if (board[i][j] == ‘1‘) {
                    board[i][j] = ‘O‘;
                }
            }
        }
    }

解法二:

  public void solve(char[][] board) {
        Queue<Integer> queue = new ArrayDeque<>();
        int rowLen = board.length;
        if (rowLen == 0) {
            return;
        }
        int[][] adj = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
        int colLen = board[0].length;
        boolean[][] visited = new boolean[rowLen][colLen];
        for (int i = 0; i < rowLen; i++) {
            for (int j = 0; j < colLen; j++) {
                if (!visited[i][j] && board[i][j] == ‘O‘) {            //标准的BFS遍历
                    boolean surround = true;
                    List<Integer> toHandle = new ArrayList<>();
                    queue.add(i * colLen + j);
                    while (!queue.isEmpty()) {
                        int key = queue.poll();
                        toHandle.add(key);
                        int x = key / colLen;
                        int y = key % colLen;
                        for (int k = 0; k < 4; k++) {                //检查O的上下左右
                            int adj_x = x + adj[k][0];
                            int adj_y = y + adj[k][1];
                            if (adj_x >= 0 && adj_y >= 0 && adj_x < rowLen && adj_y < colLen) {                  //都不在边上
                                if (board[adj_x][adj_y] == ‘O‘ && !visited[adj_x][adj_y]) {
                                    int pos = adj_x * colLen + adj_y;
                                    queue.add(pos);
                                    visited[adj_x][adj_y] = true;
                                }
                            } else {                  //有一个在边上,置surround=false
                                surround = false;
                            }
                        }
                    }
                    if (surround) {
                        for (int key : toHandle) {
                            board[key / colLen][key % colLen] = ‘X‘;
                        }
                    }
                }
            }
        }
    }
时间: 2024-07-30 13:52:24

Surrounded Regions——LeetCode的相关文章

Surrounded Regions leetcode java

题目: Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your function, the board sho

Surrounded Regions LeetCode :My Solution

Surrounded Regions Total Accepted: 14948 Total Submissions: 105121My Submissions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For exampl

Surrounded Regions -- leetcode

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your function, the board should

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar

leetcode --day12 Surrounded Regions &amp; Sum Root to Leaf Numbers &amp; Longest Consecutive Sequence

1.  Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your fu

[LeetCode][JavaScript]Surrounded Regions

Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your function

【LeetCode】 Surrounded Regions (BFS &amp;&amp; DFS)

题目:Surrounded Regions 广搜和深搜都能解决,但是LeetCode上使用深搜时会栈溢出 DFS: <span style="font-size:18px;">/*LeetCode Surrounded Regions * 题目:给定一个字符数组,由'X'和'O'组成,找到所有被x包围的o并将其替换为x * 思路:只要替换被包围的o就行,如果有一个o是边界或者上下左右中有一个是o且这个o不会被替换,则该点也不会被替换 * 从四条边开始,因为在这4周的一定不是

LeetCode: Surrounded Regions [130]

[题目] Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your function, the board sh

验证LeetCode Surrounded Regions 包围区域的DFS方法

在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ,一直百思不得其解其中的原因,直到有网友告诉我说他验证了最后一个大集合在本地机子上可以通过,那么我也来验证看看吧. class Solution { public: void solve(vector<vector<char> >& board) { for (int i =