289. 生命游戏
分析
-
原地更新(不额外开辟空间):
- 直接在原矩阵
board
上更新,但在更新过程中要避免影响到邻居细胞的判断
- 直接在原矩阵
-
状态编码(利用位运算存储两种状态):
- 最低位(第
0
位):当前细胞的状态(0
= 死,1
= 活) - 次低位(第
1
位):细胞的下一状态(0
= 死,1
= 活)
- 最低位(第
-
计算邻居活细胞数:
- 邻居遍历(避免越界)
x ∈ [max(0, i - 1), min(i + 1, n - 1)]
y ∈ [max(0, j - 1), min(j + 1, m - 1)]
- 跳过自己:
(x != i || y != j)
- 遍历细胞的八个邻居,
board[i][j] & 1
提取当前状态,统计当前活细胞数
- 邻居遍历(避免越界)
-
按规则更新下一状态:
- 活细胞 → 存活(
2~3
个邻居活细胞),否则死亡 - 死细胞 → 恰好
3
个邻居活细胞复活 board[i][j] |= (next << 1)
将下一状态存入次低位
- 活细胞 → 存活(
-
更新完成后右移一位:
board[i][j] >>= 1
,将下一状态更新为当前状态
时间复杂
总时间复杂度 O(n * m)
空间复杂度
空间复杂度为 O(1)
C++代码
|
|