446 words
2 minutes
日拱两卒(九)
2026-08-10

19#

旋转图像。

顺时针旋转90度。等价于沿副对角线对折,然后上下对折。

class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n, m = len(matrix), len(matrix[0])
for i in range(n):
for j in range(n - 1 - i):
matrix[i][j], matrix[n - 1 - j][n - 1 - i] = matrix[n - 1 - j][n - 1 - i], matrix[i][j]
for i in range(n // 2):
for j in range(n):
matrix[i][j], matrix[n - 1 - i][j] = matrix[n - 1 - i][j], matrix[i][j]

18#

螺旋矩阵。

螺旋顺序输出。

class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
ans = []
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
d = 0
x, y = 0, 0
cnt = 0
n, m = len(matrix), len(matrix[0])
visited = [[False for _ in range(m)] for _ in range(n)]
while cnt < n * m:
ans.append(matrix[x][y])
cnt += 1
visited[x][y] = True
tx, ty = x + dx[d], y + dy[d]
if tx >= n or tx < 0 or ty >= m or ty < 0 or visited[tx][ty]:
d = (d + 1) % 4
tx, ty = x + dx[d], y + dy[d]
x, y = tx, ty
return ans

17#

矩阵置零。

如果一个元素为零,把它所在的一行和一列都变成零。

O(n + m)空间的做法很容易想到,记录每一行和每一列里是否有零。

这题的考察点很莫名其妙,题干说有无常数空间做法。

以为会有很巧妙的做法。

题解的方法也感觉没有很巧妙,就是把记录的东西放在每一行和每一列的第一个元素,再特殊处理第一行与第一列。

class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
n, m = len(matrix), len(matrix[0])
first_row_zero, first_col_zero = 0, 0
for j in range(m):
first_row_zero = first_row_zero or not matrix[0][j]
for i in range(n):
first_col_zero = first_col_zero or not matrix[i][0]
for i in range(1, n):
for j in range(1, m):
if not matrix[i][j]:
matrix[0][j], matrix[i][0] = 0, 0
for i in range(1, n):
for j in range(1, m):
if not matrix[0][j] or not matrix[i][0]:
matrix[i][j] = 0
if first_row_zero:
for j in range(m):
matrix[0][j] = 0
if first_col_zero:
for row in matrix:
row[0] = 0