矩阵

1. 73. 矩阵置零

先记下来,统一记0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m = len(matrix)
n = len(matrix[0])
is_zero = []
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
is_zero.append([i, j])

for i, j in is_zero:
ii = 0
while 0 <= ii <= m-1:
matrix[ii][j] = 0
ii += 1
jj = 0
while 0 <= jj <= n-1:
matrix[i][jj] = 0
jj+= 1

2. 54. 螺旋矩阵

这方法好叼,转置后反转,取第一行

1
2
3
4
5
6
7
8
9
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
ans = []
while matrix:
ans.extend(matrix[0])
matrix.pop(0)
matrix = list(zip(*matrix))[::-1]

return ans

这个**list(zip(*matrix))[::-1]**就背吧

3. 48. 旋转图像

矩阵转置:matrix[i][j] ↔ matrix[j][i]
矩阵水平镜像:matrix[i][j] ↔ matrix[i][n-1-j]
矩阵垂直镜像:matrix[i][j] ↔ matrix[m-1-i][j]
矩阵顺时针旋转90度, new_matrix[j][n-1-i] = matrix[i][j],就相当于垂直镜像+转置
矩阵顺时针旋转180度,new_matrix[n-1-i][n-1-j] = matrix[i][j],就相当于水平镜像+垂直镜像
矩阵逆时针旋转90度,new_matrix[n-1-j][i] = matrix[i][j],就相当于水平镜像+转置
matrix[:] = [list(row) for row in zip(*matrix[::-1])]

1
2
3
4
5
6
7
8
9
10
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n = len(matrix)
# Python 这里不能 matrix_new = matrix 或 matrix_new = matrix[:] 因为是引用拷贝
matrix_new = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
matrix_new[j][n - i - 1] = matrix[i][j]
# 不能写成 matrix = matrix_new
matrix[:] = matrix_new

4. 240. 搜索二维矩阵 II

如图所示

image-20261107132806899

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:

def search(i, j, target):
up, down = 0, i
while up <= down:
mid = (up + down) / 2
mid = int(mid)
if matrix[mid][j] == target:
return True
elif matrix[mid][j] > target:
# 1
down = mid - 1
elif matrix[mid][j] < target:
up = mid + 1

i, j =0, 0
queue = []
m = len(matrix)
n = len(matrix[0])
for j in range(n-1, -1, -1):
if matrix[0][j] < target:
if search(m-1, j, target):
return True
elif matrix[0][j] == target:
return True

二分查找只需要记住:

  • nums[mid] > target:目标在左边,所以 right = mid - 1
  • nums[mid] < target:目标在右边,所以 left = mid + 1
  • nums[mid] == target:找到,返回 True

站内搜索

没有找到内容!