题目描述
思路解析动画文字版
最直接的做法:拿一块新画布,照旧网格算出每格的下一代写进去,最后整块拷回。能对,但题目要求原地,多开一整张网格不划算。
转折:与其另开网格,不如把「旧值 + 新命运」一起编码进同一格。用 4 个数:0 死、1 活、2 将生(原死下步活)、3 将死(原活下步死)。数邻居时把 1 和 3 都算「原来是活的」,全标完再统一把 2→1、3→0。这样不用额外网格。
初始 · 竖条:绿色是活细胞,组成一根竖条。接下来逐个判断每个细胞下一代的命运,数邻居时只看「旧状态」。
看中心 (1,1) · 数邻居:盯住中心 (1,1)。数它周围 8 格:只有上方 (0,1)、下方 (2,1) 是活的,共 2 个活邻居。
判 (1,1) · 存活:(1,1) 本是活的,2 个活邻居落在「2~3 存活」区间 → 它继续活,保持 1,不用打中间态。
看 (0,1) · 邻居不足:负例分支:(0,1) 是活的,但活邻居只有下方 (1,1) 这 1 个,少于 2 → 下一步死。标成 将死(3),但本轮数别人邻居时它仍按「活」算。
看 (1,0) · 死格复活:(1,0) 本是死的,但周围 (0,1)、(1,1)、(2,1) 恰好 3 个活(注意 (0,1) 虽标了将死,仍按「原来活」算) → 复活!标成 将生(2)。
同理 (1,2)、(2,1):(1,2) 同样被 3 个活邻居环绕 → 将生;(2,1) 和 (0,1) 一样只有 1 个活邻居 → 将死。四个角始终 0 个活邻居,保持死。全部标记完毕。
四角验证 · 保持死:再看四个角(蓝框):每个角的 8 邻居里活的(含将死的 3)都凑不满 3 个,死格复活需要恰好 3 个 → 它们保持死(0),不打任何中间态。负例确认完毕,可以收尾。
统一还原 · 第二遍:最后再扫一遍:将生(2)→活(1)、将死(3)→死(0)。竖条变成了横条——和示例对上了。这就是「同时更新」靠中间态实现的效果。
需要「同时」更新又想原地的问题,常用「编码中间状态、最后统一还原」这一招。
参考代码
class Solution: def gameOfLife(self, board): m, n = len(board), len(board[0]) dirs = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)] for r in range(m): for c in range(n): live = 0 for dr, dc in dirs: nr, nc = r + dr, c + dc if 0 <= nr < m and 0 <= nc < n and board[nr][nc] in (1, 3): live += 1 if board[r][c] == 1 and (live < 2 or live > 3): board[r][c] = 3 elif board[r][c] == 0 and live == 3: board[r][c] = 2 for r in range(m): for c in range(n): if board[r][c] == 2: board[r][c] = 1 elif board[r][c] == 3: board[r][c] = 0复杂度
- 时间复杂度:O(m×n),每格看 8 个邻居是常数,两遍扫描仍是 m×n
- 空间复杂度:O(1),原地改,只靠 2/3 两个中间状态,不开新网格
可套用的代码模板
记住骨架:两遍扫描——先编码同时记"旧+新"、数邻居时 1 和 3 都算"原来活",再统一还原。矩阵置零的"特殊标记法"也是同一招。
Python
# 编码: 0死 1活 2将生(死→活) 3将死(活→死)for i, j in 所有格子: live = sum(board[x][y] in (1,3) for x,y in 8邻居) # 1和3都算"原来活"! if board[i][j]==1 and not 2<=live<=3: board[i][j]=3 # 活→将死 elif board[i][j]==0 and live==3: board[i][j]=2 # 死→将生for i, j in 所有格子: board[i][j] = {2:1, 3:0}.get(board[i][j], board[i][j]) # 统一还原易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题