289. 生命游戏
不需要开出额外的数组,巧妙地存储答案,值得记录一下。但是注意这个方法只能应用在原数组为0,1的情况下
class Solution { public: int f[2][8] = {{1, -1, 0, 0, 1, -1, 1, -1}, {1, -1, 1, -1, -1, 1, 0, 0}}; void gameOfLife(vector<vector<int>>& board) { int len1, len2; len1 = board.size(); if(!len1) { return ; } int i, j, ret; len2 = board[0].size(); for(i = 0; i < len1; i++) { for(j = 0; j < len2; j++) { ret = cal(board, i, j); if(board[i][j] == 0) { if(ret == 3) { board[i][j] += 2; } } else { if(ret == 2 || ret == 3) { board[i][j] += 2; } } } } for(i = 0; i < len1; i++) { for(j = 0; j < len2; j++) { board[i][j] >>= 1; } } } int cal(vector<vector<int>>& board, int x, int y) { int ans = 0; for(int i = 0; i < 8; i++) { int tx = x + f[0][i]; int ty = y + f[1][i]; if(tx >= 0 && ty >= 0 && tx < board.size() && ty < board[0].size()) { ans += (board[tx][ty] & 1); } } return ans; } }; /* 题目本身并不难,这个题最巧妙的地方在于空间的节省,不需要开放额外的数组,通过位移运算符, 第0位为原来的值,而我们的答案存储在第一位,这样在最后输出的时候,输出第一位的值就可以了 */