矩阵
矩阵置零
直接法:先标记哪里需要变为0,在遍历mat把标记处置为0
import numpy as np
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
def turn(i,j):
flag[i,:] *= 0
flag[:,j] *= 0
flag = np.ones_like(matrix)
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 0:
turn(i,j)
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if flag[i][j] == 0:
matrix[i][j] = 0
54. 螺旋矩阵(X)
顺时针螺旋输出矩阵
模拟题:分为四个方向的遍历数组
(1)从左往右——t
(2)从上往下——r
(3)从右往左——b
(4)从下往上——l
(5)没遍历完一个方向,就把对应idx朝中心移动,直到两个对立方向相遇时推出(如 t > b)
图解
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
m = len(matrix)
n = len(matrix[0])
t, r, l, b = 0, n-1, 0, m-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
48. 旋转图像(X)
方法一:使用辅助矩阵。旋转后,第一行–>最后一列,第二行–>倒数第二列……
根据公式:m[i][j] = m[j][n-1-i]
import numpy as np
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
back_up = np.zeros_like(matrix)
n = len(matrix)
for i in range(n):
for j in range(n):
back_up[j][n-1-i] = matrix[i][j]
for i in range(n):
for j in range(n):
matrix[i][j] = int(back_up[i][j])
方法二:原地操作,使用单个辅助元素。
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n = len(matrix)
for i in range(n // 2):
for j in range((n + 1) // 2):
tmp = matrix[i][j]
matrix[i][j] = matrix[n - 1 - j][i]
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]
matrix[j][n - 1 - i] = tmp
240. 搜索二维矩阵 II
方法一:二分查找每一行,O(mlog2n)
二分模板
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m = len(matrix)
n = len(matrix[0])
for i in range(m):
l, r = 0, n-1
while l < r:
mid = l+r+1 >> 1
if matrix[i][mid] <= target:
l = mid
else:
r = mid - 1
if matrix[i][l] == target:
return True
return False
方法二:排除法
(1)每次将target与当前矩阵的右上角m[i][j]
相比,逐步的把矩阵从右上角缩小到左下角
(2)如果m[i][j]<target
,则当前行不可能存在target,删除该行
(3)如果m[i][j]>target
,则当前列不能存在target,删除列
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m = len(matrix)
n = 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
else:
j -= 1
return False