比较简单的题目,最简单的做法就是拷贝一个board数组,然后用新的数组用来比较,在旧数组上改动。
但题目要求原地改动,因此需要在原数组中记录两次的信息。
可以有两种方法:
- 使用二进制数来记录信息,第1位记录上次信息,第二位记录本次信息,计算结束后把数据右移一位,清空上次信息即可;
- 使用数字的符号记录,活细胞变死,赋值2,死细胞复活,赋值-1,这样只要判断大于0,则原来为活细胞,小于0,则原来为死细胞,计算结束后再适当处理即可。
class Solution {
public void gameOfLife(int[][] board) {
int m = board.length;
int n = board[0].length;
int[][] dir = {{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};
for(int i=0; i<m; i++){
for(int j=0; j<n;j++){
int cur = board[i][j];
int count=0;
for(int k=0;k<dir.length;k++){
int x = i+dir[k][0];
int y = j+dir[k][1];
if(x>=0 && x<m && y>=0 && y<n && (board[x][y]&1)== 1){
count++;
}
}
if(cur==1){
if(count<2||count>3){
board[i][j] = 1;//01
}else{
board[i][j] = 3;//11
}
}
if(cur==0){
if(count==3){
board[i][j] = 2;//10
}
}
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n;j++){
board[i][j] = board[i][j]>>1;
}
}
}
}