順時(shí)針打印矩陣

image.png

解法一:遞歸
第一步:
順時(shí)針打印矩陣,一圈一圈的打印,首先想到的就是用遞歸的方法,每次傳入一個(gè)矩陣,然后打印矩陣的外面的一圈。然后遞歸打印子矩陣。

當(dāng)什么時(shí)候遞歸結(jié)束呢?

  1. 當(dāng)矩陣為None的時(shí)候,即子矩陣已經(jīng)沒(méi)有的時(shí)候,比如下圖中,1234,子矩陣為空,返回


    image.png
  2. 當(dāng)矩陣為[] 時(shí),返回
  3. 當(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
  1. 首先打印出第一行 全部
  2. 打印右邊的豎直部分(不包含第一行和最后一行),當(dāng)rows>2時(shí),才需要打印
  3. 打印下面的水平部分,當(dāng)rows >1時(shí),需要打印
  4. 打印左面的水平部分,當(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])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容