Leetcode面试经典150题-130.被围绕的区域

给你一个 m x n 的矩阵 board ,由若干字符 'X''O' 组成,捕获 所有 被围绕的区域

  • **连接:**一个单元格与水平或垂直方向上相邻的单元格连接。
  • 区域:连接所有 'O' 的单元格来形成一个区域。
  • 围绕: 如果您可以用 'X' 单元格 连接这个区域 ,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单元格围绕。

通过将输入矩阵 board 中的所有 'O' 替换为 'X'捕获被围绕的区域

示例 1:

**输入:**board = [["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"]]

解释:

在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。

示例 2:

**输入:**board = [["X"]]

输出:[["X"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j]'X''O'

深度优先遍历,注意分析题意,其他的就不多说了,上代码,看不懂的请留言或者私信,收到第一时间解答

java 复制代码
class Solution {
    /**这个题的突破口是什么样的才能不被捕获:我理解如果不被捕获,这个格子必定连着某个边缘的格子
    因为边缘的格子能连通它,所以它才不被捕获,这样我们就从边缘的O开始感染,所有被感染到的标记一个Y
    这样最后除了Y之外的全部设置成X就可以了 */
    public void solve(char[][] board) {
        for(int i = 0; i < board.length; i++) {
            /**只有边缘才配感染 */
            if(board[i][0] == 'O') {
                infect(board, i, 0);
            }
            if(board[i][board[i].length - 1] == 'O') {
                infect(board, i, board[i].length - 1);
            }
        }
        for(int j = 0; j < board[0].length; j++) {
            /**只有边缘才配感染 */
            if(board[0][j] == 'O') {
                infect(board, 0, j);
            }
            if(board[board.length - 1][j] == 'O') {
                infect(board, board.length - 1, j);
            }
        }
        /**根据感染的结果进行赋值*/
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                board[i][j] = board[i][j] == 'Y'? 'O' : 'X';
            }
        }
    }

    public void infect(char[][] board, int row, int col) {
        if(row < 0 || row >= board.length || col < 0 || col >= board[row].length || board[row][col] != 'O') {
            return;
        }
        /**把自己感染成'Y'*/
        board[row][col] = 'Y';
        /**感染自己的上下左右 */
        infect(board, row - 1, col);
        infect(board, row, col + 1);
        infect(board, row + 1, col);
        infect(board, row, col - 1);
    }
}
相关推荐
2401_8574396912 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66613 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索15 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
小沈熬夜秃头中୧⍤⃝15 分钟前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
芒果披萨20 分钟前
Filter和Listener
java·filter
qq_49244844625 分钟前
Java实现App自动化(Appium Demo)
java
阿华的代码王国33 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
木向1 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越1 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
skaiuijing1 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核