289. 生命游戏

一般做法就是再声明一个同样大的数组来记录各个位置的状态,时间复杂度和空间复杂度均为O(mn)

空间复杂度为O(1)的解法:
将细胞死变活设为状态2,
将细胞活变死设为状态-1,这里设置为-1,和原来的状态1可以使用绝对值进行访问,比较方便。

注意邻居的访问。

class Solution {
    public void gameOfLife(int[][] board) {
        int m = board.length, n = board[0].length;
        int[] neighbors = {0, -1, 1};
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int livesNum = 0;
                // neighbors
                for (int r = 0; r < 3; r++) {
                    for (int c = 0; c < 3; c++) {
                        if (!(neighbors[r] == 0 && neighbors[c] == 0)) {
                            int row = i + neighbors[r];
                            int col = j + neighbors[c];

                            if ((row >= 0 && row < m) && (col >= 0 && col < n) && Math.abs(board[row][col]) == 1) {
                                ++livesNum;
                            }
                        }

                    }
                }

                // 设置状态
                if ((board[i][j] == 1) && (livesNum < 2 || livesNum > 3)) {
                    board[i][j] = -1;
                }
                if (board[i][j] == 0 && livesNum == 3) {
                    board[i][j] = 2;
                }
            }
        }
        
        // last_update
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] > 0) board[i][j] = 1;
                else board[i][j] = 0;
            }
        }
    }
}

你可能感兴趣的:(LeetCode,算法,数据结构)