
image.png
解法一:遞歸
第一步:
順時(shí)針打印矩陣,一圈一圈的打印,首先想到的就是用遞歸的方法,每次傳入一個(gè)矩陣,然后打印矩陣的外面的一圈。然后遞歸打印子矩陣。
當(dāng)什么時(shí)候遞歸結(jié)束呢?
當(dāng)矩陣為None的時(shí)候,即子矩陣已經(jīng)沒(méi)有的時(shí)候,比如下圖中,1234,子矩陣為空,返回
image.png- 當(dāng)矩陣為[] 時(shí),返回
- 當(dāng)矩陣為[[ ]]時(shí),返回
注意子矩陣的表達(dá)方法
千萬(wàn)不可以 matrix[i:x][j:y]
這樣表達(dá)的結(jié)果是(matrix[i:x])[j:y],前面的那個(gè)返回的是一個(gè)列表,然后相當(dāng)于是列表的切片處理。
正確表達(dá):
subMatrix = [matrix[i][1:cols-1] for i in range(1, rows-1)]
第二步:
打印出傳入矩陣的外圍的一圈,方向:

image.png
- 首先打印出第一行 全部
- 打印右邊的豎直部分(不包含第一行和最后一行),當(dāng)rows>2時(shí),才需要打印
- 打印下面的水平部分,當(dāng)rows >1時(shí),需要打印
- 打印左面的水平部分,當(dāng)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
解法二:循環(huán)
發(fā)現(xiàn)每次打印的左上角為(start, start) 當(dāng)2start < rows and 2start < cols 時(shí),循環(huán)。
一定要考慮邊界和特殊情況,一行,一列,一個(gè)數(shù)等
# -*- 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])
