方法一:复制一个新的二维数组
方法二:不需要额外空间,在原数组上直接操作,分为四种情况(对应题目中四种)
1、 board[i][j]=1->board[i][j] = -1(表示本来活着,后来死了,设置成-1是为了计算其他格子的时候,它的状态应该是活的,加绝对值即可)
2、board[i][j]=1不变
3、board[i][j]=1->board[i][j] = -1(表示本来活着,后来死了,设置成-1是为了计算其他格子的时候,它的状态应该是活的,加绝对值即可)
4、board[i][j]=0->board[i][j] = 2(不能将状态直接写成1,因为计算其他格子的时候,它仍然算是死的)
在分析周围一圈数字的时候,可以不需要写出来一个一个进行判断,见代码
class Solution {
public void gameOfLife(int[][] board) {
int m = board.length;
int n = board[0].length;
int[] flag = {0,-1,1};
int sum;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) {
sum = 0;
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
if (!(flag[x] == 0 && flag[y] == 0)) {
int row = i + flag[x];
int col = j + flag[y];
if ((row >= 0 && row < m) && (col >= 0 && col < n) && (Math.abs(board[row][col]) == 1)) {
sum++;
}
}
}
}
if((board[i][j]==1&&sum<2)||(board[i][j]==1&&sum>3)){
board[i][j] = -1;
}
if(board[i][j]==0&&sum==3){
board[i][j] = 2;
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]<=0) board[i][j] = 0;
if(board[i][j]>0) board[i][j] = 1;
}
}
}
}