05-矩阵
📅 发表于 2026/04/02
🔄 更新于 2026/04/02
👁️ -- 次访问
📝 0 字
⏳ 0 分钟
题目
m*n矩阵,如果某元素为0,把其所在行和列都置为0,使用原地算法。首行首列记录法
第1行,n列,来记录各列置为0的情况。第1列,n行,来记录各行置为0的情况。00位置缺一个:需要单独记录首行和首列是否置为0。题目
顺时针螺旋,输出矩阵元素。右下左上四点圈层遍历法
左右上下边界,沿边界遍历:从左->右,上->下,右->左,下->上。右->左 需保证up!=down 不在同一行。下->上 需保证left!=right 不在同一列。题目
沿顺时针旋转90度。复制赋值法
复制原始矩阵(额外空间开销),利用位置映射直接赋值。
转置翻转法
对矩阵做转置,再对每一行 沿着竖中直线做翻转。题目
每行从左到右升序、每列从上到下升序。判断target是否存在矩阵中。右上角查找法
当前值 > target:往下移动一行,继续查找当前值 < target:往左移动一列,继续查找第1行,n列,来记录各列置为0的情况。第1列,m行,来记录各行置为0的情况。00位置缺一个:需要单独记录首行和首列是否置为0。def setZeroes(self, matrix: List[List[int]]) -> None:
"""
使用第1行:n列,记录各列置为0的情况。
使用第1列:n行,记录各行置为0的情况。
00位置缺一个:单独记录第1行第1列置为0的情况
"""
if not matrix or not matrix[0]:
return
# m*n 的矩阵, m行,n列
m = len(matrix)
n = len(matrix[0])
# 第1行、第1列是否含0
row0_has0 = any(matrix[0][j] == 0 for j in range(n))
col0_has0 = any(matrix[i][0] == 0 for i in range(m))
# 使用第1行记录各列是否含0情况
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
# 第i行、第j列均设置为0
matrix[0][j] = 0
matrix[i][0] = 0
# 更新值
for i in range(1, m):
for j in range(1, n):
# 第i行或第j列为0,则ij位置为0
if matrix[0][j] == 0 or matrix[i][0] == 0:
matrix[i][j] = 0
# 首行首列
if row0_has0:
for j in range(n):
matrix[0][j] = 0
if col0_has0:
for i in range(m):
matrix[i][0] = 0
return左右上下边界,沿边界遍历:从左->右,上->下,右->左,下->上。右->左 需保证up!=down 不在同一行。下->上 需保证left!=right 不在同一列。def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
"""设置上下左右边界,左->右,上->下,右->左,下->上
"""
res = []
if not matrix or not matrix[0]:
return res
m = len(matrix)
n = len(matrix[0])
# 定义上下左右边界值
up, down = 0, m-1
left, right = 0, n-1
while True:
# 从左往右遍历
for j in range(left, right+1):
res.append(matrix[up][j])
# 从上往下遍历
for i in range(up+1, down+1):
res.append(matrix[i][right])
# 从右往左遍历,需保证up和down不在同一行,才需要遍历
if up != down:
for j in range(right-1, left-1, -1):
res.append(matrix[down][j])
# 从下往上遍历, 需保证left和down不在同一列,才需要遍历
if left != right:
for i in range(down-1, up, -1):
res.append(matrix[i][left])
# 前进
up += 1
down -= 1
left += 1
right -= 1
# 终止循环
if left > right or up > down:
break
return res核心思想
ij元素的新位置,进行赋值即可。def rotate_copy_row(self, matrix: List[List[int]]) -> None:
""" 旋转矩阵,复制一行,粘贴到列上
"""
raw_matrix = copy.deepcopy(matrix)
n = len(matrix)
for i in range(n):
# 第i行,# 复制原ij位置的数
for j in range(n):
# 新的行列位置
new_row_idx = j
new_col_idx = n - i - 1
matrix[new_row_idx][new_col_idx] = raw_matrix[i][j]
return matrix核心思想
先对矩阵做转置:行变列。注意转置遍历只需遍历右上三角
再对每行沿竖中直线做翻转
def rotate_transpose_then_flip(self, matrix: List[List[int]]) -> None:
""" 先对矩阵做转置,再对每一行沿着中间做翻转
"""
if not matrix or len(matrix) == 0:
return 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 i in range(n):
matrix[i].reverse()
return matrix核心思想
右上角出发(0,n-1),进行查找 当前值 > target:往下移动一行,继续查找当前值 <target:往左移动一列,继续查找当前值 == target:找到。def searchMatrix_rightupcorner(self, matrix: List[List[int]], target: int) -> bool:
""" 从右上角开始查找。
"""
if not matrix or len(matrix) == 0:
return False
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
elif matrix[i][j] < target:
# 往下走
i += 1
elif matrix[i][j] > target:
# 往左找
j -= 1
return False