这道题和前一篇博客的题有一定的相似之处,都是要求处理矩阵,都要进行矩阵的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;
}
}
}
};