面试150 生命游戏

思路

深度优先遍历的思路,对当前细胞八个方向进行遍历,统计存活的细胞,并通过标记修改board数组,如果细胞死亡则标记为-1,细胞复活标记为2。再次遍历数组,然后根据标记修改数组即可

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])
        directions=[(-1,0),(0,-1),(0,1),(1,0),(1,1),(-1,1),(-1,-1),(1,-1)]

        def dfs(i,j):
            count=0
            for x,y in directions:
                new_x=x+i 
                new_y=y+j 
                if 0<=new_x<m and 0<=new_y<n and abs(board[new_x][new_y])==1:
                    count+=1
            return count

        for i in range(m):
            for j in range(n):
                live=dfs(i,j)
                if board[i][j]==1 and live<2:
                    board[i][j]=-1
                elif board[i][j]==1 and live>3:
                    board[i][j]=-1
                elif board[i][j]==0 and live==3:
                    board[i][j]=2
        for i in range(m):
            for j in range(n):
                if board[i][j]<0:
                    board[i][j]=0
                elif board[i][j]>0:
                    board[i][j]=1                

值得注意的是,abs(board[new_x][new_y])==1,是为了正确统计当前细胞的邻居原本是"活"的数量。因为在原地修改的时候-1表示原来是活的,下一个状态要变成死

相关推荐
Sailing7 分钟前
🚨别再滥用 useEffect 了!90% React Bug 的根源就在这
前端·javascript·面试
河马老师8 分钟前
写这需求快崩溃了,幸好我会装饰器模式
前端·javascript·面试
Mr_Xuhhh13 分钟前
LeetCode 热题 100 刷题笔记:数组与排列的经典解法
数据结构·算法·leetcode
神奇小汤圆17 分钟前
5分钟 快速上手 Function Calling
面试
鹏程十八少24 分钟前
8. Android 深入插件化Shadow源码:揭秘插件Activity启动的完整链路(源码解析)
java·前端·面试
老四啊laosi25 分钟前
[双指针] 3. 力扣--快乐数
算法·leetcode·快慢指针
程序员清风26 分钟前
OpenAI创始人学AI的底层逻辑,普通人照着做就能上手!
java·后端·面试
会编程的土豆30 分钟前
leetcode hot 100 之哈希
算法·leetcode·哈希算法
秋天的一阵风31 分钟前
【LeetCode 刷题系列|第 3 篇】详解大数相加:从模拟竖式到简洁写法的优化之路🔢
前端·算法·面试
_深海凉_40 分钟前
LeetCode热题100-反转链表
python·leetcode·链表