Leetcode演算法——54、螺旋矩陣(spiral matrix)
阿新 • • 發佈:2018-12-10
給定一個矩陣 m*n,返回所有元素的螺旋排列順序(從左上角開始,順時針旋轉,由外向內)。
示例1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
示例2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
思路
1、遞迴法
先輸出最外圈的順時針順序,然後用同樣方法處理剩下的元素。
最外圈的順時針順序為:
1、最上面一行,從左到右
2、最右面一列,從上到下
3、最下面一行,從右到左
4、最左面一列,從下到上
然後,使用遞迴法,處理第二圈、第三圈等,直到矩陣最中間的一圈被處理完畢(這也是遞迴結束條件)。
2、遞迴法(一行程式碼)
另外一種遞迴法:
1、讀取最上面一行,從左到右
2、將最上面一行從矩陣中刪除
3、將矩陣逆時針旋轉90度。
4、遞迴,繼續處理最上面一行。
遞迴結束條件:矩陣為空。
實際上,這種方法只需要用一行python程式碼便可以實現:
def spiralOrder2(matrix):
return matrix and [*matrix.pop(0)] + spiralOrder2([*zip(*matrix)][::-1])
其中,
1、當 matrix = [] 時,matrix and [*matrix.pop(0)]
2、[*zip(*matrix)]
表示將 matrix 的第一列作為第一行,第二列作為第二行… 即將矩陣進行對角線對稱。
python語法:
*
後面加上可迭代物件,相當於將可迭代物件依次列出。
可以用在兩個場合:
1、[*a] 表示將a變為list,相當於 list(a)
2、fun(*a) 表示將a變為list,並且每個元素分別作為fun()的一個引數,即這時 fun 被傳入了多個引數,而不是一個。
比如:
>>> matrix = [1,2,3]
>>> type(*matrix)
Traceback (most recent call last):
File "<ipython-input-283-d63d2bd0f73e>", line 1, in <module>
type(*matrix)
TypeError: type.__new__() argument 1 must be str, not int
相當於執行了 type(1,2,3),因此會報錯。
3、[*zip(*matrix)][::-1]
表示先將 matrix 進行對角線對稱,然後將所有行逆序排列。
比如原矩陣為:
matrix = [
[1,2,3],
[4,5,6]
]
先對角線對稱:
matrix2 = [
[1,4],
[2,5],
[3,6]
]
再逆序排列:
matrix3 = [
[3,6],
[2,5]
[1,4]
]
可見, matrix3 是 matrix 逆時針旋轉 90 度的結果。
python實現
def spiralOrder(matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
遞迴法。
先輸出最外圈的順時針順序,然後用同樣方法處理剩下的元素。
"""
# 遞迴結束條件
if not matrix or len(matrix[0]) == 0:
return []
if len(matrix) == 1: # 只有一行
return matrix[0]
if len(matrix[0]) == 1: # 只有一列
return [x[0] for x in matrix]
# 最外圈的螺旋排列
result = matrix[0] # 第一行
result += [x[-1] for x in matrix][1:-1] # 最後一列
result += matrix[-1][::-1] # 最後一行
result += [x[0] for x in matrix][-2:0:-1] # 第一列
# 切割出剩餘元素
remain = [matrix[i][1:-1] for i in range(1,len(matrix)-1)]
return result + spiralOrder(remain)
def spiralOrder2(matrix):
'''
遞迴法,一行程式碼。
'''
return matrix and [*matrix.pop(0)] + spiralOrder2([*zip(*matrix)][::-1])
if '__main__' == __name__:
matrix = [
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
print(spiralOrder2(matrix))