Game of Life

O(1)的空间都好解决,无非两个状态合并一起再解开,关键没办法写出很简洁的代码

class Solution(object):
    def gameOfLife(self, board):
        """
        :type board: List[List[int]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        n = len(board)
        if not n:
            return 

        m = len(board[0])
        if not m:
            return 

        for i in xrange(n):
            for j in xrange(m):
                board[i][j] = [board[i][j], 0]

        dirs = [[0, 1], [1, 0], [-1, 0], [0, -1], [1, -1], [1, 1], [-1, 1], [-1, -1]]
        for i in xrange(n):
            for j in xrange(m):
                countLive, countDead = 0, 0
                for row, col in dirs:
                    curRow, curCol = i + row, j + col
                    if 0 <= curRow < n and 0 <= curCol < m:
                        if board[curRow][curCol][0]:
                            countLive += 1
                        else:
                            countDead += 1
                if board[i][j][0]:
                    if 2 <= countLive <= 3:
                        board[i][j][1] = 1
                    else:
                        board[i][j][1] = 0
                elif countLive == 3:
                    board[i][j][1] = 1


        for i in xrange(n):
            for j in xrange(m):
                board[i][j] = board[i][j][1]

如果不像上面这么麻烦的修改,我们还可以看到0,1状态只有一个bit位,我们可以再引入一个bit位表示下一个状态,比如2(10)代表当前是死亡,下一轮复活,3(11)代表当前和下一轮都是存活状态,这时我们需要查当前状态与1就行,需要改成下个状态>> 1就行

class Solution(object):
    def gameOfLife(self, board):
        """
        :type board: List[List[int]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        n = len(board)
        if not n:
            return 

        m = len(board[0])
        if not m:
            return 

        dirs = ((0, 1,), (0, -1,), (1, -1), (1, 0), (1, 1), \
                (-1, -1), (-1, 0), (-1, 1))
        for i in xrange(n):
            for j in xrange(m):
                countOfLive = self.detect(board, i, j, n, m, dirs)
                if board[i][j] and 2 <= countOfLive <= 3:
                    board[i][j] = 3
                elif not board[i][j] and countOfLive == 3:
                    board[i][j] = 2

        for i in xrange(n):
            for j in xrange(m):
                board[i][j] = board[i][j] >> 1

    def detect(self, board, row, col, n, m, dirs):
        result = 0
        for i, j in dirs:
            curRow, curCol = row + i, col + j
            if 0 <= curRow < n and 0 <= curCol < m:    
                if board[curRow][curCol] & 1:
                    result += 1
        return result

results matching ""

    No results matching ""