row
:记录哪些行需要被置零,长度为矩阵的行数 m
。col
:记录哪些列需要被置零,长度为矩阵的列数 n
。matrix[i][j] == 0
,则将 row[i]
和 col[j]
标记为 True
。row[i]
或 col[j]
为 True
,则将 matrix[i][j]
置为 0。O(m * n)
。O(m * n)
。O(m * n)
。row
:O(m)
。col
:O(n)
。O(m + n)
。class Solution(object):
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: None Do not return anything, modify matrix in-place instead.
"""
m, n = len(matrix), len(matrix[0])
row, col = [False]* m, [False]* n
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
row[i] = col[j] = True
for i in range(m):
for j in range(n):
if row[i] or col[j]:
matrix[i][j] = 0
left
、right
、up
、down
,分别表示当前螺旋遍历的左、右、上、下边界。(0, 1)
(向右)、(1, 0)
(向下)、(0, -1)
(向左)、(-1, 0)
(向上)。M
和列数 N
。left = 0
、right = N - 1
、up = 0
、down = M - 1
。res
。(x, y)
为 (0, 0)
。cur_d
为 0
(向右)。matrix[x][y]
添加到结果列表 res
中。cur_d == 0
)且到达右边界(y == right
),则切换到向下方向(cur_d = 1
),并将上边界 up
加 1。cur_d == 1
)且到达下边界(x == down
),则切换到向左方向(cur_d = 2
),并将右边界 right
减 1。cur_d == 2
)且到达左边界(y == left
),则切换到向上方向(cur_d = 3
),并将下边界 down
减 1。cur_d == 3
)且到达上边界(x == up
),则切换到向右方向(cur_d = 0
),并将左边界 left
加 1。(x, y)
为下一个方向的位置。res
的长度等于矩阵元素总数 M * N
。res
。O(M * N)
。O(M * N)
。O(1)
。O(M * N)
(主要由结果列表决定)。class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix or not matrix[0]: return []
M, N = len(matrix), len(matrix[0])
left, right, up, down = 0, N - 1, 0, M - 1
res = []
x, y = 0, 0
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
cur_d = 0
while len(res) != M * N:
res.append(matrix[x][y])
if cur_d == 0 and y == right:
cur_d += 1
up += 1
elif cur_d == 1 and x == down:
cur_d += 1
right -= 1
elif cur_d == 2 and y == left:
cur_d += 1
down -= 1
elif cur_d == 3 and x == up:
cur_d += 1
left += 1
cur_d %= 4
x += dirs[cur_d][0]
y += dirs[cur_d][1]
return res
n x n
的二维矩阵,将其顺时针旋转 90 度。i
从 0
到 n // 2 - 1
)。i
行和第 n - i - 1
行的元素。[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
水平翻转后变为: [7, 8, 9]
[4, 5, 6]
[1, 2, 3]
i
从 0
到 n - 1
,j
从 0
到 i - 1
)。matrix[i][j]
和 matrix[j][i]
。[7, 8, 9]
[4, 5, 6]
[1, 2, 3]
主对角线翻转后变为: [7, 4, 1]
[8, 5, 2]
[9, 6, 3]
O(n^2)
。O(n^2)
。O(n^2)
。O(1)
。class Solution(object):
def rotate(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: None
"""
n = len(matrix)
# 水平翻转
for i in range(n // 2):
for j in range(n):
matrix[i][j], matrix[n - i - 1][j] = matrix[n - i - 1][j], matrix[i][j]
# 主对角线翻转
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
m x n
的二维矩阵,矩阵的每一行从左到右递增,每一列从上到下递增。判断目标值 target
是否存在于矩阵中。target
,返回 True
。target
,则排除当前行(因为当前行的所有元素都小于 target
)。target
,则排除当前列(因为当前列的所有元素都大于 target
)。target
或搜索完整个矩阵。m
和列数 n
。i
和 j
,分别指向矩阵的右上角(i = 0
, j = n - 1
)。matrix[i][j] == target
,返回 True
。matrix[i][j] < target
,说明当前行的所有元素都小于 target
,因此向下移动一行(i += 1
)。matrix[i][j] > target
,说明当前列的所有元素都大于 target
,因此向左移动一列(j -= 1
)。i
超出矩阵的行数或 j
小于 0,说明搜索完整个矩阵仍未找到 target
,返回 False
。灵神的方法真的秒啊!
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: 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 # 找到 target
if matrix[i][j] < target:
i += 1 # 这一行剩余元素全部小于 target,排除
else:
j -= 1 # 这一列剩余元素全部大于 target,排除
return False