劍指offer—順時針打印矩陣

題目:輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣:
4*4矩陣
最後的輸出是:
順時針輸出矩陣

思路

第一眼看到首先想到的肯定是算法書上的一道類似的題目,通過4個for循環來進行遍歷。把每一圈都劃分爲一個子問題進行求解。但是問題是,如何確定每一個for循環的邊界?一旦邊界出現錯誤,就會有些數字沒有進行輸出,另一些數字反而重複輸出。

函數:
 def output(self,result,matrix,n,size_one,size_two,count)

result是最後的輸出列表。matrix是二維數組。n表示第幾次調用這個函數,初始值是0。size_one表示本次調用的矩陣的行數。size_two表示本次調用的矩陣的列數。count表示最大需要調用多少次這個函數。

步驟

首先把最外圈首次調用函數看成n=0,也就是如圖:
第一次調用函數
第一行看成第一個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[0][0]到array[0][3]。其中最後一個輸出的列是n+size_two-1。這也就確定了第一個for循環是從array[n][n]到array[n][n+size_two-1]。代碼如下:

for i in range(0,size_two):
            result.append(matrix[n][n+i])

接着把最外圈的最後一列看成第二個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[1][3]到array[3][3]。第一個輸出是array[n+1][n+size_two-1]到array[n+size_one-1][n+size_two-1]。代碼如下:

for i in range(n+1,n+size_one):
            result.append(matrix[i][n+size_two-1])

接着把最外圈的最後一行看成第三個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[3][2]到array[3][0]。第一個輸出是array[n+size_one-1][n+size_two-2]到array[n+size_one-1][n]。代碼如下:

for i in range(2,size_two+1):         
                result.append(matrix[n+size_one-1][n+size_two-i])

接着把最外圈的第一列看成第四個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[2][0]到array[1][0]。第一個輸出是array[n+size_one-2][n]到array[n+1][n]。代碼如下:

for i in range(2,size_one):         
                result.append(matrix[n+size_one-i][n])

然後我們就得到了上圖中紅色部分的輸出。再調用一次這個函數,這個時候n=1。輸出圖中藍色部分。
第二次調用函數的輸出

這個時候調用函數時傳進去的參數是

output(result,matrix,n+1,size_one-2,size_two-2,count)

需要注意的是因爲每一次調用函數的輸出是一圈,所以最後剩下的矩陣的大小是行數減少2,列數減少2。

問題

這個代碼還有一個問題,就是如果輸出到最後只剩下一行,或者只剩下一列,那麼就會重複輸出,所以我們必須要對後兩個for循環進行約束,必須在行數和列數同時不爲1的時候才進行後面兩個for循環。

最後的函數代碼:

# -*- coding:utf-8 -*-
class Solution:
    # matrix類型爲二維列表,需要返回列表
    def printMatrix(self, matrix):
        result = []
        size_one = len(matrix)
        size_two = len(matrix[0])
        if size_one>size_two:
            if size_two%2==1:
                count = (size_two+1)/2
            else:
                count = size_two/2
        else:
            if size_one%2==1:
                count = (size_one+1)/2
            else:
                count = size_one/2
        self.output(result,matrix,0,size_one,size_two,count)
        return result

    def output(self,result,matrix,n,size_one,size_two,count):
        for i in range(0,size_two):
            result.append(matrix[n][n+i])
        for i in range(n+1,n+size_one):
            result.append(matrix[i][n+size_two-1])
        if n!=n+size_two-1 and n!=n+size_one-1:
            for i in range(2,size_two+1):         
                result.append(matrix[n+size_one-1][n+size_two-i])
            for i in range(2,size_one):                   ##
                result.append(matrix[n+size_one-i][n])
        if n+1<count:
            self.output(result,matrix,n+1,size_one-2,size_two-2,count)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章