# 59、螺旋矩阵 II
思路
循环遍历
while 嵌套 while
注意
边界条件
每行/每列都是左开右闭区间
最后一个元素
n为奇偶的不同
区别
matrix = [[0] * n] * n
matrix = [[0 for _ in range(n)] for _ in range(n)]
都能生成一个 n × n 的全零矩阵
前者每行各个元素之间是独立的
但是前者各行本质上是浅复制,改变某一行则全部行都一同改变
后者各行之间是独立的,每行各个元素之间也是独立的
# 54、螺旋矩阵
思路
同上
注意
边界条件
每行/列除了判断 i j 是否越界,还需要判断 m 是否越界?可优化
当行列数均为奇但不相等时,最终结果会多一个数,删掉即可,节省判断流程
最后一个元素
行列数相等且为奇时特殊情况
提前结束循环,否则会死循环,最终结果少一个数,再额外加上
# LCR 146、螺旋遍历二维数组
题目同上
注意
矩阵行列数为零的特殊情况
# 36、有效的数独
思路
分别判断行、列、九宫格即可
注意
除法会将整型变成浮点,注意使用 int() 的位置
# 48、旋转图像
思路
寻找旋转前后对应元素的坐标关系
以每四个元素为一组(旋转后刚好构成一个循环)
用一个额外变量存储初始值
然后从外至内、从左至右(四个元素中的第一个)依次遍历即可
两次翻转
有点类似于旋转数组的题
先上下水平翻转,再沿对角线翻转
也只需要一个额外变量
注意
四个一组时可以用四个额外变量存储(依次变换坐标值)
也可以只用一个(提前算好四个坐标值)
# 74、矩阵置零
思路
用额外数组存储某一行某一列是否含零
用第一行第一列代替额外数组进行存储
然后再用两个额外变量存储第一行第一列是否含零
用一个额外变量存储第一列是否含零
第一列第一个元素存储第一行是否含零
第一列其他元素和第一行存储每一行和每一列是否含零
# 289、生命游戏
思路
用额外矩阵存储每个细胞下一时刻的状态
空间复杂度高(O(mn)),只需遍历一次矩阵
用额外状态存储每个细胞下一时刻的状态
如 2 表示 从 0 到 1,-1 表示 从 1 到 0
空间复杂度低(O(1)),但需要遍历两次矩阵
生成全零矩阵的方法
len(board) = n,len(board[0]) = m
new_board = [[0 for _ in range(m)] for _ in range(n)]
注意是先列数 m 后行数 n,即先是生成一行零,然后复制到每一行