def setZeroes(matrix):
if not matrix or not matrix[0]:
return
m, n = len(matrix), len(matrix[0])
row0 = any(matrix[0][j] == 0 for j in range(n)) # 首行是否有0
col0 = any(matrix[i][0] == 0 for i in range(m)) # 首列是否有0
# 标记需置零的行/列
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = matrix[0][j] = 0
# 按标记置零(行)
for i in range(1, m):
if matrix[i][0] == 0:
matrix[i] = [0] * n
# 按标记置零(列)
for j in range(1, n):
if matrix[0][j] == 0:
for i in range(m):
matrix[i][j] = 0
# 处理首行/首列
if row0: matrix[0] = [0] * n
if col0:
for i in range(m):
matrix[i][0] = 0
if __name__ == "__main__":
import sys
input = sys.stdin.read().split()
ptr = 0
m = int(input[ptr]); ptr +=1
n = int(input[ptr]); ptr +=1
mat = []
for _ in range(m):
row = list(map(int, input[ptr:ptr+n]))
ptr +=n
mat.append(row)
setZeroes(mat)
for row in mat:
print(' '.join(map(str, row)))
def main():
import sys
input = sys.stdin.read().split()
ptr = 0
m = int(input[ptr])
ptr +=1
n = int(input[ptr])
ptr +=1
matrix = []
for _ in range(m):
row = list(map(int, input[ptr:ptr+n]))
matrix.append(row)
ptr +=n
# 核心逻辑
res = []
if not matrix or not matrix[0]:
print(res)
return
top, bottom = 0, m-1
left, right = 0, n-1
while top <= bottom and left <= right:
# 1. 从左到右遍历上边界
for j in range(left, right+1):
res.append(matrix[top][j])
top +=1
# 2. 从上到下遍历右边界
for i in range(top, bottom+1):
res.append(matrix[i][right])
right -=1
# 3. 从右到左遍历下边界(需判断top<=bottom)
if top <= bottom:
for j in range(right, left-1, -1):
res.append(matrix[bottom][j])
bottom -=1
# 4. 从下到上遍历左边界(需判断left<=right)
if left <= right:
for i in range(bottom, top-1, -1):
res.append(matrix[i][left])
left +=1
# 输出结果(ACM格式)
print(' '.join(map(str, res)))
if __name__ == "__main__":
main()
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row=len(matrix)
col=len(matrix[0])
if not matrix or col==1:
return matrix #无需反转,返回原来的矩阵
#实现转置
for j in range(col):
for i in range(j+1,row):
matrix[j][i],matrix[i][j]=matrix[i][j],matrix[j][i]
#反转每一行
for i in range(row):
matrix[i]=matrix[i][::-1]
return matrix
优化思路(时间复杂度 O (m+n),无需额外空间):从矩阵右上角开始遍历(也可从左下角),利用单调性缩小范围:
初始化行指针i=0,列指针j=n-1(右上角);
循环判断:
若matrix[i][j] == target:找到目标,返回 True;
若matrix[i][j] > target:目标更小,向左移动列指针(j-=1);
若matrix[i][j] < target:目标更大,向下移动行指针(i+=1);
若指针越界(i>=m 或 j<0),返回 False。
3、能不能用图示意?
4、暴力法
5、优化法
python复制代码
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
row,col=len(matrix),len(matrix[0])
#边界条件:矩阵为空,目标大于矩阵最大或者小于矩阵最小
if not matrix or not matrix[0]:
return False
found=False
i,j=0,col-1
while i<row and j>=0:
if matrix[i][j]==target:
found= True
# return True
break
elif matrix[i][j]>target:
j-=1
elif matrix[i][j]<target:
i+=1
return True if found else False
# return False