力扣Hot100矩阵问题详解(Python版)
一、73. 矩阵置零
遍历全部元素,遇到为0的行、列就保存行号,列好(这里要使用字典,为了去重)
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row_set = set()
col_set = set()
# 标记所有需要置零的行和列
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 0:
row_set.add(i)
col_set.add(j)
# 将标记的行和列置零
for row in row_set:
for j in range(len(matrix[0])):
matrix[row][j] = 0
for col in col_set:
for i in range(len(matrix)):
matrix[i][col] = 0
二、54. 螺旋矩阵
螺旋矩阵相关的题目建议都这样做,定义好l, r, t, b;while循环遍历整个矩阵,每次遍历一行或者一列,就缩小边界;判断边界是否违反常识,违反就跳出循环。
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix: return []
l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
while True:
for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
t += 1
if t > b: break
for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r: break
for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
b -= 1
if t > b: break
for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
l += 1
if l > r: break
return res
三、48. 旋转图像
先将上下三角两两交换,再行交换
# 思路:先进行对角线交换,在每一行交换就完成转换90度
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n = len(matrix)
for j in range(n):
for i in range(j):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
for i in range(n):
matrix[i].reverse()
# 也可以写为
# for i in range(n):
# matrix[i] = matrix[i][::-1]
四、240. 搜索二维矩阵 II
站在矩阵的右上角来说,当前元素是当前行最大,当前列的最小值。判断右上角元素和target的关系,从而简化剩余矩阵
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
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 # 1.找到 target
if matrix[i][j] < target:
i += 1 # 这一行剩余元素全部小于 target,排除
else:
j -= 1 # 这一列剩余元素全部大于 target,排除
return False
作者:Y1nhl