剑指Offer第19题-顺时针打印矩阵
2018-05-26 本文已影响0人
Joseph_Chu
题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
考点
画图让抽象形象化
思路
一般来讲,顺时针打印一圈会走两行两列。可以用矩阵左上角和右下角的坐标作为当前需要顺时针遍历的这一圈的标识。每遍历完一圈,就将左上角和右下角沿着对角线各朝内移动一格。每次遍历通过移动二维数组的索引值i, j 即可。
这题的难点在于如何避免重复打印。
比如遇到单行或单列矩阵时就容易出现从头到尾打印后又从尾到头打印一遍的情况。此时可以通过在顺时针遍历往回走的阶段(从右到左,从下到上)检查最小行(列)号和最大行(列)号是否相同来解决。
代码
def printMatrix(matrix):
# write code here
result_list = []
row_min = 0
row_max = len(matrix) - 1
col_min = 0
col_max = len(matrix[0]) - 1
while row_max >= row_min and col_max >= col_min:
i = row_min
j = col_min
# left -> right
while j <= col_max:
result_list.append(matrix[i][j])
if j == col_max:
break
j += 1
# up -> down
while i < row_max:
i += 1
result_list.append(matrix[i][j])
# right -> left
while j > col_min:
if row_max - row_min == 0:
break
j -= 1
result_list.append(matrix[i][j])
while i > row_min + 1:
if col_max - col_min == 0:
break
i -= 1
result_list.append(matrix[i][j])
row_min += 1
col_min += 1
row_max -= 1
col_max -= 1
return result_list