class Solution {
public void gameOfLife(int[][] board) {
List<IndexNum> modifyList = new ArrayList<>(); //存需要改变的坐标
int m = board.length, n = board[0].length;
// 坐标数组
int[] dx = {-1, -1, -1, 0, 0 ,1, 1, 1};
int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int count = 0;
for (int k = 0; k < 8; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x < 0 || x >= m || y < 0 || y >= n) {
continue;
}
if (board[x][y] == 1) {
count++;
}
}
if (board[i][j] == 0 && count == 3) { // 死细胞
modifyList.add(new IndexNum(i, j));
} else if (board[i][j] == 1 && (count < 2 || count > 3)) { // 活细胞
modifyList.add(new IndexNum(i, j));
}
}
}
for (IndexNum index : modifyList) {
if (board[index.x][index.y] == 0) {
board[index.x][index.y] = 1;
} else {
board[index.x][index.y] = 0;
}
}
}
class IndexNum {
int x;
int y;
IndexNum(int x, int y) {
this.x = x;
this.y = y;
}
}
}
不用额外的内存空间:
class Solution {
// 复合状态: 从活的变成死的用-1表示、从死的变成活的用2表示
public void gameOfLife(int[][] board) {
if (board == null) {
return;
}
int m = board.length, n = board[0].length;
int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1};
int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int count = 0;
for (int k = 0; k < 8; k++) {
int x = i + dx[k];
int y = j + dy[k];
if ((x >= 0 && x < m) && (y >= 0 && y < n) && (board[x][y] == 1 || board[x][y] == -1)) {
count++;
}
}
if (board[i][j] == 0 && count == 3) {
board[i][j] = 2; //死的变活
} else if (board[i][j] == 1 && (count < 2 || count > 3)) {
board[i][j] = -1; //活的变死
}
}
}
for (int i = 0; i < m ; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == -1) {
board[i][j] = 0;
} else if (board[i][j] == 2) {
board[i][j] = 1;
}
}
}
}
}