1. 程式人生 > >【劍指Offer】15順時針列印矩陣

【劍指Offer】15順時針列印矩陣

題目描述

輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下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.

時間限制:1秒;空間限制:32768K;本題知識點:陣列

解題思路

思路一

常規思路,將一次迴圈分為4步:從左到右、從上到下、從右到左、從下到上,注意避免重複,每次迴圈後判斷剩餘矩陣是否還能繼續這樣分4步列印,否則直接停止(行列數相同的情況)或列印一行後停止(列數大於行數的情況)或列印一列後停止(行數大於列數的情況)。

Python程式碼:

# -*- coding:utf-8 -*-
class Solution:
    # matrix型別為二維列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        l = []
        row = len(matrix)
        column = len(matrix[0])
        xy = 0#起點座標
        while True:
            # 結束條件
            if xy == row//2:
                # 需要從上到下再列印一列
                if row%2 == 1:
                    for i in range(xy,column-xy):
                        l.append(matrix[xy][i])
                break
            if xy == column//2:
                # 需要從左到右再列印一行
                if column%2 == 1:
                    for i in range(xy,row-xy):
                        l.append(matrix[i][xy])
                break
            #1 從左到右列印一整行
            for i in range(xy,column-xy):
                l.append(matrix[xy][i])
            #2 從上到下列印一列,上下各少1個防止重複
            for i in range(xy+1,row-xy-1):
                l.append(matrix[i][column-xy-1])
            #3 從右到左列印一整行
            for i in range(column-xy,xy,-1): #注意反向的寫法,步長-1,用的時候i再-1
                l.append(matrix[row-1-xy][i-1])
            #4 從下到上列印一列,上下各少1個防止重複
            for i in range(row-xy-1,xy+1,-1):
                l.append(matrix[i-1][xy])
            # 迴圈
            xy += 1
        return l

思路二

利用矩陣旋轉的思路,每次取出第一行,然後將矩陣逆時針旋轉。

# -*- coding:utf-8 -*-
class Solution:
    # matrix型別為二維列表,需要返回列表
    def printMatrix(self, matrix):
        result = []
        while len(matrix) > 0:
            result += matrix[0]
            matrix = list(zip(*matrix[1:])) #矩陣轉置
            matrix = matrix[::-1] #倒序
        return result