zoukankan      html  css  js  c++  java
  • 【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' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

    关键:识别是深度遍历DFS的题,我写的DFS比下面的太复杂了,

    链接:https://www.nowcoder.com/questionTerminal/c159db5028034aa595043a1a220a62dd
    来源:牛客网

    /*
     * 所有与四条边相连的O都保留,其他O都变为X
     * 遍历四条边上的O,并深度遍历与其相连的O,将这些O都转为*
     * 将剩余的O变为X
     * 将剩余的*变为O
     */
    public int rowNum = 0;
    public int colNum = 0;
    public void solve(char[][] board) {
        if(board == null || board.length <= 0|| board[0].length <= 0){
            return;
        }
        rowNum = board.length;
        colNum = board[0].length;
        for(int i = 0; i < colNum; i++){
            dfs(board, 0, i);
            dfs(board, rowNum-1, i);
        }
        for(int i = 0; i < rowNum; i++){
            dfs(board, i, 0);
            dfs(board, i, colNum-1);
        }
        for(int i = 0; i < rowNum; i++){
            for(int j = 0; j < colNum; j++){
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }
            }
        }
        for(int i = 0; i < rowNum; i++){
            for(int j = 0; j < colNum; j++){
                if(board[i][j] == '*'){
                    board[i][j] = 'O';
                }
            }
        }
    }
    private void dfs(char[][] board, int row, int col) {
        // TODO Auto-generated method stub
        if(board[row][col] == 'O'){
            board[row][col] = '*';
            if(row > 1){
                dfs(board, row-1, col);
            }
            if(col > 1){
                dfs(board, row, col-1);
            }
            if(row < rowNum-1){
                dfs(board, row+1, col);
            }
            if(col < colNum-1){
                dfs(board, row, col+1);
            }
        }
    }
  • 相关阅读:
    你写的单例真的安全吗?
    CountDownLatch&&CyclicBarrier
    初步认识AQS
    Atomic底层原理
    volatile关键字
    Linux常用服务类相关命令
    线程池
    由浅入深TheradLocal
    synchronized关键字
    .net 中dapper实现事务的三种方式总结
  • 原文地址:https://www.cnblogs.com/twoheads/p/10593436.html
Copyright © 2011-2022 走看看