题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
代码实现:
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
'''
#自己写的有问题
a=len(matrix) #行
m=[]
if a==0:
return m
b=len(matrix[0]) #列
j=0
q=1
i=0
bottom=a-1
top=0
left=0
right=b-1
#while i<a*b:
while j<=right :
m[i]=matrix[top][j]
i += 1
j += 1
j -= 1
i -= 1
left += 1
while q<=bottom:
m[i]=matrix[q][right]
q+=1
i+=1
right -= 1
j -= 1
while j>=top:
m[i]=matrix[bottom][j]
j-=1
i+=1
j += 1
top += 1
bottom -=1
q -= 2
while q>=left:
m[i]=matrix[q][left]
q-=1
i+=1
q += 1
return m
'''
'''博客答案
upper_i =0;lower_i=m-1;left_j=0;right_j=n-1
num=1
i=0;j=0
right_pointer=1
down_pointer=0
while(num<=m*n):
ans.append(matrix[i][j])
if right_pointer==1:
if j<right_j:
j=j+1
else:
right_pointer=0
down_pointer=1
upper_i = upper_i+1
i = i+1
elif down_pointer == 1:
if i<lower_i:
i = i+1
else:
right_pointer=-1
down_pointer=0
right_j = right_j -1
j = j-1
elif right_pointer ==-1:
if j > left_j:
j=j-1
else:
right_pointer=0
down_pointer=-1
lower_i =lower_i-1
i = i-1
elif down_pointer == -1:
if i > upper_i:
i=i-1
else:
right_pointer=1
down_pointer=0
left_j = left_j +1
j = j+1
num=num+1
return ans
'''
rows = len(matrix)
cols = len(matrix[0])
out = []
if rows==0:
return out
top = 0
bottom = rows-1
left = 0
right = cols-1
while top<=bottom and left<=right:
for i in range(left,right+1):
out.append(matrix[top][i])
for i in range(top+1,bottom+1):
out.append(matrix[i][right])
if top!=bottom:
for i in range(left,right)[::-1]:
out.append(matrix[bottom][i])
if left!=right:
for i in range(top+1,bottom)[::-1]:
out.append(matrix[i][left])
top += 1
bottom -= 1
left += 1
right -= 1
return out
思路:
首先先输出top=0行,matrix[0][i],i在left(0),1,2,3,...,right范围,即range(left,right+1)
然后输出最右列right列,matrix[i][right],i在top(0),1,2,...,bottom范围,即range(top,bottom+1)
一次旋转到下方matrix[bottom][i] ,i在right-1,right-2,...,top范围,即range(left,right)的逆序
左方,matrix[i][left],i在bottom-1,bottom-2,...,top+1范围,即range(top+1,bottom)的逆序
然后top ++,bottom--,left++,right--。只要top<=bottom,left<=right,就要重复上述步骤。