289. Game of Life

博客指出该题与前一篇都要求处理矩阵,进行0、1变换且原地完成,空间复杂度O(1)、时间复杂度O(mn),难点在于空间复杂度。通过将矩阵数值变化的4种状态用00、01、10、11表示解决问题,还可采用取余和移位操作精简代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题和前一篇博客的题有一定的相似之处,都是要求处理矩阵,都要进行矩阵的0,1变换,都要在原地完成,空间复杂度是O(1),时间复杂度要求是O(mn),难点就在空间复杂度是O(1)这里,因为要求不能使用更新过的数值去更新以他元素,因此,需要在原表中记录前后两个状态。

其实,在矩阵中,每一个位置的数值变化分为有两种状态,变或者不变,独营的,每个位置上的数值也有两种,0或者1,这就使得二维矩阵中的数值变化操作分为4种,0到0, 0到1, 1到0,1到1,将上述四种状态分别用 00 (0),01 (1), 10 (2), 11(3),这样就解决了上述问题,当遇到0和2时,说明初始状态是0,遇到1,3时,说明初始状态是1,同样的,遇到0,1时,改变后的状态是0, 遇到2,3时,改变后的状态是1,当然,可以采用取余和移位等操作来减小if语句的数量,提高代码的精简程度。具体的操作见代码:

 

class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        for (int i=0; i<board.size(); ++i) {
            for (int j=0; j<board[i].size(); ++j) {
                int roundCell = 0;
                for (int m=-1; m<2; ++m) {
                    for (int n=-1; n<2; ++n) {
                        if ((!m && !n) || (i+m<0 || i+m>=board.size() || j+n<0 || j+n>=board[0].size())) {
                            continue;
                        } else if(board[i+m][j+n] % 2) {
                            ++roundCell;
                        }
                    }
                }
                if(board[i][j]){
                    if (roundCell==2 || roundCell==3) {
                        board[i][j] = 3;
                    }
                } else {
                    if (roundCell == 3) {
                        board[i][j] = 2;
                    }
                }
            }
        }
        
        for (int i=0; i<board.size(); ++i) {
            for (int j=0; j<board[i].size(); ++j) {
                board[i][j] = board[i][j]>>1;
            }
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值