【一天一道Leetcode】螺旋矩陣

本篇推文共計(jì)2000個(gè)字,閱讀時(shí)間約3分鐘。
01
題目描述

題目描述:
給你一個(gè)m行n列的矩陣matrix,
請(qǐng)按照順時(shí)針螺旋順序,返回矩陣中的所有元素。
如下面的示例:

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:
1. m == matrix.length
2. n == matrix[i].length
3. 1 <= m, n <= 10
4. -100 <= matrix[i][j] <= 100
02
方法和思路
由題意可知,整個(gè)矩陣需要螺旋打開,
更直白的表述可以說像現(xiàn)實(shí)中的蛋糕卷一樣,
進(jìn)行平鋪展開。

這個(gè)過程中最難的是需要讓矩陣判斷出90度的拐角,
碰到90度拐角的時(shí)候,進(jìn)行旋轉(zhuǎn)90度操作。

這個(gè)時(shí)候不得不提到Python的zip內(nèi)置函數(shù):
zip()函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成元組,然后返回由這些元組的對(duì)象,這樣做的好處是節(jié)約了不少的內(nèi)存。
我們可以使用list()轉(zhuǎn)換來輸出列表。
利用*號(hào)操作符,可以將元組解壓為列表。
簡(jiǎn)單點(diǎn)來說,zip函數(shù)可以實(shí)現(xiàn)矩陣轉(zhuǎn)置的功能。
例如下面的這個(gè)案例:
input=[(1,2,3), (4,5,6), (7,8,9)]
print("原始數(shù)組輸入:",input)
print("轉(zhuǎn)置數(shù)組輸出:",list(zip(*input)))輸出為:


另外一方面:
matrix[::-1]可以實(shí)現(xiàn)矩陣?yán)@水平對(duì)稱軸做對(duì)稱操作,
例如下面的這個(gè)案例:
input=[(1,2,3), (4,5,6), (7,8,9)]
output=input[::-1]
print("原始數(shù)組輸入:",input)
print("對(duì)稱數(shù)組輸出:",output)輸出為:


我們發(fā)現(xiàn)zip內(nèi)置函數(shù)加matrix[::-1]對(duì)稱,
兩個(gè)操作加起來就是順時(shí)針轉(zhuǎn)90度。
例如下面的這個(gè)案例:
input=[(1,2,3), (4,5,6), (7,8,9)]
output=list(zip(*input))[::-1]
print("原始數(shù)組輸入:",input)
print("對(duì)稱數(shù)組輸出:",output)輸出為:

結(jié)合矩陣圖,我們可以看到:

zip內(nèi)置函數(shù)加matrix[::-1]對(duì)稱,
可以實(shí)現(xiàn)順時(shí)針旋轉(zhuǎn)90度。

通過上述方法,就處理好了順時(shí)針90度旋轉(zhuǎn)的問題。
同時(shí)新建一個(gè)新數(shù)組,
用于存儲(chǔ)經(jīng)過順時(shí)針90度旋轉(zhuǎn)得到的數(shù)。
最后矩陣展開的最后結(jié)果就是新數(shù)組的輸出。

我們用代碼表示此題的解法如下:
class Solution(object):
def spiralOrder(self, matrix):
new=[]
while matrix:
new+=matrix[0]
matrix=list(zip(*(matrix[1:])))[::-1]
return new
【年終總結(jié)】你好2021,再見2020。

【快速寫好畢業(yè)論文】你不得不知曉的七個(gè)常用文獻(xiàn)搜索平臺(tái)

【秋招紀(jì)實(shí)錄】一篇特別正經(jīng)的【騰訊】求職經(jīng)驗(yàn)分享

【一天一道Leetcode】回文字符串-最少分割次數(shù)

【一天一道Leetcode】合并兩個(gè)有序鏈表

【一天一道Leetcode】套信封問題
你與世界
只差一個(gè)
公眾號(hào)

