顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.
示例1
输入
[[1,2],[3,4]]
返回值
[1,2,4,3]
解题思路:
- 设置up,down,left,right四个点。
先向右走,将整行的值保存下来。该行再也不会被遍历到,则代表上界的up的值+1,该值不能超过下界down的值。
向下走,将整列的值保存下来。该列再也不会被遍历到,则代表右界的right的值-1,该值不能小于左界left的值。
向左走,将整行的值保存下来。该行再也不会被遍历到,则代表下界的down的值-1,该值不能小于上界up的值。
向上走,将整列的值保存下来。该列再也不会被遍历到,则代表左界的left的值+1,该值不能超过右界right的值。
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
if not matrix :
return matrix
up = 0
down = len(matrix) - 1
left = 0
right = len(matrix[0]) - 1
result = []
while up <= down or left<= right:
#先向右走,将整行的值保存下来
for i in range(left,right+1):
result.append(matrix[up][i])
up += 1 #代表上界的up的值+1
if up>down: #该值不能超过下界down的值
return result
#向下走,将整列的值保存下来
for i in range(up,down+1):
result.append(matrix[i][right])
right -= 1 #代表右界的right的值-1
if right<left: #该值不能小于左界left的值
return result
#向左走,将整行的值保存下来。
for i in range(right,left-1,-1):
result.append(matrix[down][i])
down -= 1 #代表下界的down的值-1
if down<up: #该值不能小于上界up的值。
return result
#向上走,将整列的值保存下来
for i in range(down,up-1,-1):
result.append(matrix[i][left])
left += 1 #代表左界的left的值+1
if left>right: #该值不能超过右界right的值
return result
- 将第一行的值保存下来后,将它从矩阵中去掉,然后将矩阵从“地面”向左翻转90度。重复该操作直到矩阵为空。如:
【【 1, 2, 3, 4】,
【 5, 6, 7, 8】,
【 9,10,11,12】,
【13,14,15,16】】
变为:
【【 5, 6, 7, 8】,
【 9,10,11, 12】,
【13,14,15, 16】】
变为:
【【8,12,16】,
【7,11,15】,
【6,10,14】,
【5, 9,13】】
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
if not matrix:
return matrix
result = []
while len(matrix) > 0:
#extend 在列表末尾一次性追加另一个序列中的多个值
result.extend(matrix[0]) #将第一行的值保存下来
if len(matrix) > 1: #去掉第一行的值后是否矩阵为空
matrix = matrix[1::] #去掉第一行的值
else:
return result
#将矩阵逆时针翻转90度
matrix = [[row[i] for row in matrix] for i in range(len(matrix[0])-1,-1,-1)]