题目, 我觉得最简单的方法就是用四个for循环把他解出来,一个一个枚举,用两个矩阵进行保存

public class Main {
    public void gameOfLife(int[][] board) {
        int length = board.length;// 得到数组的长
        int wide = board[0].length;// 得到数组的宽
        int[][] temp = new int[length][wide];// 用于存放新的状态
        for (int i = 0; i < length; i++) {//一个一个分情况看
            for (int x = 0; x < wide; x++) {
                int sum;
                if (board[i][x] == 1) {
                    sum = -1;
                } else
                    sum = 0;// 记录八个邻居有几个活细胞
                for (int t1 = i - 1; t1 <= i + 1; t1++) {// for循环不能放太多if条件 不然会让程序出错
                    for (int t2 = x - 1; t2 <= x + 1; t2++) {
                        if (t1 > -1 && t1 < length) {//一开始将条件 放在for 循环里面,导致答案出错
                            if (t2 > -1 && t2 < wide) {
                                if (board[t1][t2] != 0) {
                                    sum++;
                                }
                            }
                        }
                    }
                }
                if (sum < 2) {//条件分析
                    temp[i][x] = 0;
                } else if (sum == 2) {
                    temp[i][x] = board[i][x];
                } else if (sum == 3) {
                    temp[i][x] = 1;
                } else if (sum > 3) {
                    temp[i][x] = 0;
                }
            }
        }
        for (int i = 0; i < length; i++) {//一个一个读回去
            for (int x = 0; x < wide; x++) {
                board[i][x] = temp[i][x];
            }
        }
    }
    public static void main(String[] args) {//测试用例
        Main m = new Main();
        int arr[][] = { { 0, 1, 0 }, { 0, 0, 1 }, { 1, 1, 1 }, { 0, 0, 0 } };
        m.gameOfLife(arr);
        for (int i = 0; i < arr.length; i++) {
            for (int x = 0; x < arr[0].length; x++) {
                System.out.print(arr[i][x]);
            }
            System.out.println();
        }
    }
}

其他人的解法

class Solution {
    //第一遍遍历,将1并且周围有两个或三个1的位置设为-1,-1表示这个位置细胞是死的,先设为-1,后面再设为0
    //第二遍遍历,将0并且周围有三个1的位置设为2,2表示这个位置细胞是活的,先设为2,后面再设为1
    //第三遍遍历,将所有-1设为0,所有2设为1
    //计算周围活着的细胞个数时,取1或-1的绝对值
//将值换的话 需要不影响其他值 ,该解法也做到这一点 将值替换成其他数 
    public void gameOfLife(int[][] board) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                int count = count(board, i, j);
                if (board[i][j] == 1 && count != 2 && count != 3) {
                    board[i][j] = -1;
                }
            }
        }
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                int count = count(board, i, j);
                if (board[i][j] == 0 && count == 3) {
                    board[i][j] = 2;
                }
            }
        }
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == -1) {
                    board[i][j] = 0;
                }else if(board[i][j] == 2) {
                    board[i][j] = 1;
                }
            }
        }
    }

    private int count(int[][] board, int row, int col) {统计周围有几个活细胞
        int liveAround = 0;
        int rowMax = row + 1 > board.length - 1 ? board.length - 1 : row + 1;
        int colMax = col + 1 > board[0].length - 1 ? board[0].length - 1 : col + 1;
        int rowMin = row - 1 < 0 ? 0 : row - 1;
        int colMin = col - 1 < 0 ? 0 : col - 1;
        for (int i = rowMin; i >= 0 && i <= rowMax; i++) {
            for (int j = colMin; j >= 0 && j <= colMax; j++) {
                if (!(row == i && col == j) && Math.abs(board[i][j]) == 1) {
                    liveAround++;
                }
            }
        }
        return liveAround;
    }
}

public void gameOfLife(int[][] board) {
if (board == null || board.length == 0) return;
int m = board.length, n = board[0].length;

for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        int lives = liveNeighbors(board, m, n, i, j);

        // In the beginning, every 2nd bit is 0;
        // So we only need to care about when will the 2nd bit become 1.
        if (board[i][j] == 1 && lives >= 2 && lives <= 3) {  
            board[i][j] = 3; // Make the 2nd bit 1: 01 ---> 11
        }
        if (board[i][j] == 0 && lives == 3) {
            board[i][j] = 2; // Make the 2nd bit 1: 00 ---> 10
        }
    }
}

for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        board[i][j] >>= 1;  // Get the 2nd state.
    }
}

}

public int liveNeighbors(int[][] board, int m, int n, int i, int j) {
int lives = 0;
for (int x = Math.max(i - 1, 0); x <= Math.min(i + 1, m - 1); x++) {
for (int y = Math.max(j - 1, 0); y <= Math.min(j + 1, n - 1); y++) {
lives += board[x][y] & 1;
}
}
lives -= board[i][j] & 1;
return lives;
}
```