LeetCode刷题笔记(Surrounded Regions)

今天刷的这道题感觉难度很适中,不过还是得感谢IDE(Clion)强大的代码编写与纠错能力,下面就和大家分享一下经验吧!

题目如下:

题意分析:

给定一个包含字母‘X’和'O'的二维平面,请将所有被‘X’包围的'O'替换成‘X’。注:在边界上的'O'是无法被‘X’包围的,所以不需要替换成‘X’。

方法一(DFS递归法)

先扫描二维平面的四条边,如果有'O'则用DFS遍历,将所有连着的'O'都变成另一个字符'#',然后二维平面中剩余的'O'都是被包围的,于是遍历二维平面将这些'O'变成'X',同时把'#'变回'O'即可。

解题代码如下:

class Solution{
private:
    int row, col;
    int d[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};

    void findsolve( vector<vector<char>>& board, int startx, int starty ){
        board[startx][starty] =  '#';

        for (int i = 0; i < 4; ++i) {
            int newx = startx + d[i][0];
            int newy = starty + d[i][1];
            if ( newx >= 0 && newx < row && newy >= 0 && newy < col && board[newx][newy] == 'O')
                findsolve( board, newx, newy );
        }
        return;
    }


public:
    void solve( vector<vector<char>>& board ){
        row = board.size();
        if (row == 0 || row == 1) return;
        col = board[0].size();
        for ( int i = 0; i < row; i = i + row - 1 ) {
            for (int j = 0; j < col; j ++ ) {
                if ( board[i][j] == 'O' )
                    findsolve( board, i, j );
            }
        }

        for ( int i = 0; i < row; i ++ ) {
            for (int j = 0; j < col; j = j + col -1 ) {
                if ( board[i][j] == 'O' )
                    findsolve( board, i, j );
            }
        }

        for ( int i = 0; i < row; i ++ ) {
            for (int j = 0; j < col; j ++ ) {
                if ( board[i][j] == 'O' ) board[i][j] = 'X';
                if ( board[i][j] == '#' ) board[i][j] = 'O';
            }
        }

    }

};

提交后的结果如下:

 

方法二(优化方法一)

可以不用两次两层for循环扫描二维平面的四条边,直接一次两层for循环即可完成。

解题代码如下:

class Solution{
private:
    int row, col;
    int d[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};

    void findsolve( vector<vector<char>>& board, int startx, int starty ){
        board[startx][starty] =  '#';

        for (int i = 0; i < 4; ++i) {
            int newx = startx + d[i][0];
            int newy = starty + d[i][1];
            if ( newx >= 0 && newx < row && newy >= 0 && newy < col && board[newx][newy] == 'O')
                findsolve( board, newx, newy );
        }
        return;
    }


public:
    void solve( vector<vector<char>>& board ){
        row = board.size();
        if (row == 0 || row == 1) return;
        col = board[0].size();
        for ( int i = 0; i < row; i ++ ) {
            for (int j = 0; j < col; j ++ ) {
                if ( i == 0 || j == 0 || i == row-1 || j == col-1 )
                    if ( board[i][j] == 'O' )
                        findsolve( board, i, j );
            }
        }

        for ( int i = 0; i < row; i ++ ) {
            for (int j = 0; j < col; j ++ ) {
                if ( board[i][j] == 'O' ) board[i][j] = 'X';
                if ( board[i][j] == '#' ) board[i][j] = 'O';
            }
        }

    }
};

提交后的结果如下:

 

 

 

日积月累,与君共进,增增小结,未完待续。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值