
image.png
解法一:递归
第一步:
顺时针打印矩阵,一圈一圈的打印,首先想到的就是用递归的方法,每次传入一个矩阵,然后打印矩阵的外面的一圈。然后递归打印子矩阵。
当什么时候递归结束呢?
当矩阵为None的时候,即子矩阵已经没有的时候,比如下图中,1234,子矩阵为空,返回
image.png- 当矩阵为[] 时,返回
- 当矩阵为[[ ]]时,返回
注意子矩阵的表达方法
千万不可以 matrix[i:x][j:y]
这样表达的结果是(matrix[i:x])[j:y],前面的那个返回的是一个列表,然后相当于是列表的切片处理。
正确表达:
subMatrix = [matrix[i][1:cols-1] for i in range(1, rows-1)]
第二步:
打印出传入矩阵的外围的一圈,方向:

image.png
- 首先打印出第一行 全部
- 打印右边的竖直部分(不包含第一行和最后一行),当rows>2时,才需要打印
- 打印下面的水平部分,当rows >1时,需要打印
- 打印左面的水平部分,当cols > 1 是,需要打印,否则与2重合了
代码:
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def __init__(self):
self.ans = []
def printMatrix(self, matrix):
# write code here
if matrix == None or len(matrix) == 0 or len(matrix[0]) == 0:
return
rows = len(matrix)
cols = len(matrix[0])
self.ans.extend(self.printFun(matrix))
subMatrix = [matrix[i][1:cols-1] for i in range(1, rows-1)]
self.printMatrix(subMatrix)
return self.ans
def printFun(self,matrix):
rows = len(matrix)
cols = len(matrix[0])
l = []
for j in range(0,cols):
l.append(matrix[0][j])
if rows >= 3:
for i in range(1,rows-1):
l.append(matrix[i][cols-1])
if rows > 1:
for j in range(cols-1, -1,-1):
l.append(matrix[rows-1][j])
if cols > 1 :
for i in range(rows-2,0,-1):
l.append(matrix[i][0])
return l
解法二:循环
发现每次打印的左上角为(start, start) 当2start < rows and 2start < cols 时,循环。
一定要考虑边界和特殊情况,一行,一列,一个数等
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
rows = len(matrix)
cols = len(matrix[0])
if matrix == None or rows <= 0 or cols <= 0:
return
start = 0
self.ans = []
while cols > start*2 and rows > start *2:
self.printFun(matrix, start)
start += 1
return self.ans
def printFun(self,matrix, start):
rows = len(matrix)
cols = len(matrix[0])
endCol = cols - start -1
endRow = rows - start -1
for j in range(start, endCol+1):
self.ans.append(matrix[start][j])
if start < endRow:
for i in range(start+1, endRow):
self.ans.append(matrix[i][endCol])
if start <= endCol and start < endRow:
for j in range(endCol, start-1, -1):
self.ans.append(matrix[endRow][j])
if start < endCol :
for i in range(endRow-1, start, -1):
self.ans.append(matrix[i][start])
