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';
                        }
                    }
                }
            }
        }
    }
Surrounded Regions——LeetCode的更多相关文章
- Surrounded Regions leetcode java
		题目: Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is capt ... 
- Surrounded Regions - LeetCode
		目录 题目链接 注意点 解法 小结 题目链接 https://leetcode.com/problems/surrounded-regions/ 注意点 边缘不算包围'O' 解法 解法一:dfs.找处 ... 
- [LeetCode] Surrounded Regions 包围区域
		Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ... 
- 验证LeetCode Surrounded Regions 包围区域的DFS方法
		在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ ... 
- 【LeetCode】130. Surrounded Regions (2 solutions)
		Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ... 
- Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
		Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ... 
- [LeetCode] 130. Surrounded Regions 包围区域
		Given a 2D board containing 'X' and 'O'(the letter O), capture all regions surrounded by 'X'. A regi ... 
- 【leetcode】Surrounded Regions
		Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ... 
- leetcode 200. Number of Islands 、694	 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions
		两种方式处理已经访问过的节点:一种是用visited存储已经访问过的1:另一种是通过改变原始数值的值,比如将1改成-1,这样小于等于0的都会停止. Number of Islands 用了第一种方式, ... 
随机推荐
- Git学习之添加远程仓库
			好久没有写过博客了,只因人生世事无常! 前言:说实话,早就听说了Git这个代码管理工具的NB之处,却一直没有时间好好学习下.现在终于有时间学习一下这个伟大的工具,在此写下在学习过程中遇到的问题! 推荐 ... 
- SPOJ 181 - Scuba diver 二维背包
			潜水员要潜水,给出n个气缸(1<=n<=1000),每个气缸中有氧气量为ti,氮气量为ai,气缸重量为wi(1<=ti<=21,1<=ai<=79,1<=wi ... 
- angularjs项目中关于服务的应用
			/** *普通ajax请求公共服务 */ mainModule.factory('myService',function($http,$q){ var service = {}; var baseUr ... 
- border属性妙用
			以前只知道border属性是盒模型中的边框属性,一直不清楚每个边的border是矩形拼接有重合呢,还是梯形无缝拼接的. border梯形 为了观察边框究竟是哪一种拼接方式,为边框设置不同的颜色背景,代 ... 
- Oracle数据表恢复
			用于直接drop掉表的情况(plsql developer直接删掉表就是drop操作) 查删除的表select object_name,original_name,partition_name,typ ... 
- sql语句分页代码
			SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO alter proc sp_SelectInfomationByKeyWord--创建一个存储过程 - ... 
- for update被锁定解锁
			查找被锁定的表,用户,session:SELECT object_name, machine, s.sid, s.serial#FROM gv$locked_object l, dba_object ... 
- Sublime Text 2 自动开启换行 Word Wrap
			首先当然要夸一下神器 Sublime Text 2,自从第一次用我就彻底把神马 Notepad++ 和 TextMate 打入冷宫,用来开发 WEB 项目从此 IDE 都不需要了! 下面讲讲如何自动开 ... 
- 认识<hr>标签,添加水平横线
			在信息展示时,有时会需要加一些用于分隔的横线,这样会使文章看起来整齐些.如下图所示: 语法: html4.01版本 <hr> xhtml1.0版本 <hr /> 注意: 1. ... 
- 安装SVN及实现nginx web同步更新需要在WDCP一键安装包的基础上
			一.安装 1.查看是否安装cvs rpm -qa | grep subversion 2.安装 yum install subversion 3.测试是否安装成功 /usr/bin/svnserve ... 
