算法-被围绕的区域

做面试题,做面试题!

题意:

给一个二维的矩阵,包含 ‘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.解题思路

这个题最重要的一个特点就是,我们需要将被围绕起来的O换成X,所以只要跟边界连接的O是不能变的。所以这个题的关键是:怎么判断一个O是否是与边界连接的呢?

在矩阵中有两种O,一种是跟边界连接的O,一种是不与边界连接的O。假设,我们找到了所有与边界连接的O,那么我们可以将这些O换成另一个字符(这里是*),然后重新遍历数组,凡是遇到O的均变成X。这样就能达到我们的目的了。

那么怎么找到所有与边界连接的O呢?一个矩阵无非是4条边,我们可以从4条边上可以查找O,凡是找到了O,将它替换成为*,然后在递归的查找4个方向。这样我们就能找到所有与边界连接的O了。

2.代码

 1     public void surroundedRegions(char[][] board) {
 2         // write your code here
 3         if(board == null || board.length == 0 || board[0].length == 0){
 4             return ;
 5         }
 6         //遍历第一列和最后一列
 7         for(int i = 0; i < board.length; i++){
 8             //第一列找到了与边界相连的O,进入递归函数,递归查找其他的O
 9             if(board[i][0] == ‘O‘){
10                 search(board, i, 0);
11             }
12             //最后一列
13             if(board[i][board[0].length - 1] == ‘O‘){
14                 search(board, i, board[0].length - 1);
15             }
16         }
17         //遍历第一行和最后一行
18         for(int i = 0; i < board[0].length; i++){
19             if(board[0][i] == ‘O‘){
20                 search(board, 0,i);
21             }
22             if(board[board.length - 1][i] == ‘O‘){
23                 search(board,board.length - 1, i);
24             }
25         }
26         //跟新数组
27         for(int i = 0; i < board.length; i++){
28             for(int j = 0; j < board[0].length; j++){
29                 if(board[i][j] == ‘O‘){
30                     board[i][j] = ‘X‘;
31                 }
32                 if(board[i][j] == ‘*‘){
33                     board[i][j] = ‘O‘;
34                 }
35             }
36         }
37
38     }
39     private void search(char[][]board, int row, int column){
40         if(row < 0 || column < 0 || row >= board.length || column >= board[0].length){
41             return ;
42         }
43         //记住,这里一定是!= O,因为*和X是不递归的,只有O才递归
44         if(board[row][column] != ‘O‘){
45             return ;
46         }
47         board[row][column] = ‘*‘;
48         //四个方向
49         search(board, row, column - 1);
50         search(board, row, column + 1);
51         search(board, row - 1, column);
52         search(board, row + 1, column);
53     }
时间: 2024-10-08 10:21:28

算法-被围绕的区域的相关文章

lintcode:被围绕的区域

被围绕的区域 给一个二维的矩阵,包含 '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 解题参考岛屿的个数 然而我还是写不出来programcreek 有下面的一段话: This problem is similar to Number of Islands. In this pr

被围绕的区域 &#183; 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 [暴力解法]: 时间分析: 空间分析: [思维问题]: 找四周都是平原的盆地感觉不好找:可以尝试逆向思维,找开了口和外界有联系的盆地 "注水"的过程通过图形化抽象后再用数学表达出来是bf

【1】【leetcode-130】 被围绕的区域

(DFS思路对,写复杂了) 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 '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 O X X 解释 被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'. 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为

130被围绕的区域

题目:给定一个二维的矩阵,包含 'X' 和 'O'(字母 O).找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 来源:https://leetcode-cn.com/problems/surrounded-regions/ 法一:自己的代码 思路:先绕外围走一圈,将所有与外围相连的岛屿都标记为True,然后把bool数组中位置为False的置为‘X’,为了节省空间可以直接将外围的‘O’,改为‘A’,然后再替换. from typing import List c

lintcode - 被围绕的区域

1 class Solution { 2 public: 3 /* 4 * @param board: board a 2D board containing 'X' and 'O' 5 * @return: nothing 6 */ 7 bool flag[220][220]; 8 vector<pair<int, int>> v; 9 const int dir[4][2] = {{0,1}, {1,0}, {0, -1}, {-1, 0}}; 10 int isChange

leetccode-130-被围绕的区域

题目描述: 方法一:dfs class Solution: def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ if not board or len(board)<=2 or len(board[0])<=2: return row = len(board)

DFS+并查集思想求被围绕的区域

class Solution { private int[][] dir= {{0,-1},{-1,0},{0,1},{1,0}}; private boolean[][] used; public boolean isMove(char[][] board,int x,int y) { if(x>=0&&x<board.length&&y>=0&&y<board[0].length) return true; return fals

2017校招常考算法题归纳&amp;典型题目汇总

2017校招即将来临,我们为大家整理了2017校招的常考算法类型,以及对应的典型题目. 另附参考答案地址:http://www.jiuzhang.com/solution/ 数学 尾部的零 斐波纳契数列 x的平方根 x的平方根 2 大整数乘法 骰子求和 最多有多少个点在一条直线上 超级丑数 比特位操作 将整数A转换为B 更新二进制位 二进制表示 O(1)时间检测2的幂次 二进制中有多少个1 动态规划 编辑距离 正则表达式匹配 交叉字符串 乘积最大子序列 二叉树中的最大路径和 不同的路径 通配符匹

python数字图像处理(19):骨架提取与分水岭算法

骨架提取与分水岭算法也属于形态学处理范畴,都放在morphology子模块内. 1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize()函数和medial_axis()函数.我们先来看Skeletonize()函数. 格式为:skimage.morphology.skeletonize(image) 输入和输出都是一幅二值图像. 例1: from s