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 ans17
矩阵置零。
如果一个元素为零,把它所在的一行和一列都变成零。
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