矩阵标准答案¶
记忆核心:矩阵先分清行列。访问永远是 matrix[行][列]。
48 旋转图像¶
- 题目:把
n*n矩阵原地顺时针旋转 90 度。 - 思路:先沿主对角线转置,再反转每一行。
- 标准答案:
class Solution:
def rotate(self, matrix):
n = len(matrix)
for i in range(n):
for j in range(i + 1, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
for row in matrix:
row.reverse()
- 小坑:原地修改,不需要返回矩阵。
54 螺旋矩阵¶
- 题目:按顺时针螺旋顺序返回矩阵所有元素。
- 思路:维护上下左右四条边界,每走完一圈就收缩边界。
- 标准答案:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
l, r, t, b = 0, len(matrix[0]) - 1, 0, len(matrix) - 1
res = []
while True:
for i in range(l, r + 1):
res.append(matrix[t][i])
t += 1
if t > b:
break
for i in range(t, b + 1):
res.append(matrix[i][r])
r -= 1
if l > r:
break
for i in range(r, l - 1, -1):
res.append(matrix[b][i])
b -= 1
if t > b:
break
for i in range(b, t - 1, -1):
res.append(matrix[i][l])
l += 1
if l > r:
break
return res
- 小坑:每走完一条边就立刻检查边界;
l/r是列边界,t/b是行边界。
73 矩阵置零¶
- 题目:如果某个元素是 0,就把它所在行和列全部置为 0,要求原地修改。
- 思路:用第一行和第一列做标记,额外记录第一行是否本来有 0。
- 标准答案:
class Solution:
def setZeroes(self, matrix):
m, n = len(matrix), len(matrix[0])
first_row_zero = any(matrix[0][j] == 0 for j in range(n))
for i in range(1, m):
for j in range(n):
if matrix[i][j] == 0:
matrix[i][0] = 0
matrix[0][j] = 0
for i in range(1, m):
for j in range(n - 1, -1, -1):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
if first_row_zero:
for j in range(n):
matrix[0][j] = 0
- 小坑:从第二行开始处理,第一行单独记录。
240 搜索二维矩阵 II¶
- 题目:矩阵每行升序、每列升序,判断 target 是否存在。
- 思路:从右上角出发。当前值太大就左移,太小就下移。
- 标准答案:
class Solution:
def searchMatrix(self, matrix, target):
m, n = len(matrix), len(matrix[0])
i, j = 0, n - 1
while i < m and j >= 0:
if matrix[i][j] == target:
return True
if matrix[i][j] > target:
j -= 1
else:
i += 1
return False
- 小坑:240 不是 74;这里不能把矩阵整体当一维有序数组。