顺时针打印矩阵
数组处理类型的题目,每种情况列举将比较麻烦。
方法一,顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印,同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况
def printMatrix(self, matrix):
if not matrix:
return []
res = []
row = len(matrix)
col = len(matrix[0])
circle = (min(row, col) - 1) // 2 + 1 #循环的次数
for i in range(circle):
for j in range(i, col - i):
res.append(matrix[i][j])
for j in range(i + 1, row - i):
res.append(matrix[j][col - i - 1])
for j in range(col - i - 2, i - 1, -1):
if row - i - 1!=i:
res.append(matrix[row - i - 1][j])
for j in range(row - i - 2, i, -1):
if col - i - 1!=i:
res.append(matrix[j][i])
return res
or 设置圈子的上下左右范围会直观理解一点:
def printMatrix(self, matrix):
if not matrix:
return []
res = []
row = len(matrix)
col = len(matrix[0])
circle = (min(row, col) - 1) // 2 + 1
left,top,right,buttom = 0,0,col-1,row-1
for i in range(circle):
for j in range(left,right+1):
res.append(matrix[i][j])
for j in range(top+1,buttom+1):
res.append(matrix[j][right])
if top!= buttom:
for j in range(right-1,left-1,-1):
res.append(matrix[buttom][j])
if left!=right:
for j in range(buttom-1,top,-1):
res.append(matrix[j][left])
left += 1
right -= 1
top += 1
buttom -=1
return res
方法二:矩阵旋转,每次取矩阵的第一行,任何逆时针旋转再取第一行。
def printMatrix(self, matrix):
res = []
while matrix:
res += matrix.pop(0)
matrix =zip(*matrix)[::-1]
return res
或者一行。。
return matrix and list(matrix.pop(0)) + self.printMatrix(zip(*matrix)[::-1])