【LeetCode】289.生命游戏

如何原地对数组进行修改是比较困难的,递归的算法无法做到。那有什么方式能简化吗?可以设计多种数字用于记录细胞的状态,不同的数字记录了不同的时刻和状态,从而简化了题目。

1.题目

2.思想

本题题意虽然比较复杂,但是还是属于比较简单的一道题。有两种思路可以解:

  • copy一个一模一样的数组,然后挨个计算条件,将结果放到原数组中。
  • 更改状态。
    说实话,第二种思想真的是很有意思。时刻分成两种:现在和未来;状态分成"死"或者"活"。所以就可以得到下面这张图:

    根据设计的思路就可以得到下面这个代码。

3.代码

python 复制代码
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        m = len(board)
        n = len(board[0])
        for i in range(m):
            for j in range(n):
                alive_cnt = self.getNum(i,j,m,n,board)
                # 现在是活的,后面死了
                if alive_cnt < 2 and board[i][j] == 1: # 条件1
                    board[i][j] = 4 
                elif alive_cnt == 2 and board[i][j] == 1: # 条件2-1
                    board[i][j] = 5
                elif alive_cnt == 3 and board[i][j] == 1: # 条件2-2
                    board[i][j] = 5                                
                elif alive_cnt > 3 and board[i][j] == 1:# 条件3
                    board[i][j] = 4
                elif alive_cnt == 3 and board[i][j] == 0:# 条件3
                    board[i][j] = 3
        # print(board)
        for i in range(m):
            for j in range(n):
                board[i][j] %= 2

    # 返回活着的细胞个数
    # m行n列
    def getNum(self,x,y,m,n,board):
        alive_cnt = 0
        a = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
        for i in a:
            new_x, new_y = x+i[0], y+i[1]
            if 0<=new_x<m and 0<=new_y <n:
                # 要看之前的状态
                if board[new_x][new_y] == 1 or board[new_x][new_y] == 4 or board[new_x][new_y] == 5:
                    alive_cnt+=1                
        return alive_cnt
相关推荐
shehuiyuelaiyuehao7 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
203号居民8 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾9 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP9 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin10 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_1010 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
船厂电气自动化ai大模型11 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳11 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了66611 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法
靠沿12 小时前
贪心算法专题(三)
算法·贪心算法