Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 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]
LeetCode:链接
剑指offer原题:剑指Offer_编程题19:顺时针打印矩阵
LeetCode变体:LeetCode59:Spiral Matrix II
第一种方法:用四个变量来控制边界,然后因为方向总是:→↓←↑ 左右下上。可以把矩阵想象成若干个圈,用一个循环打印矩阵,每次打印矩阵的一个圈。
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if len(matrix) == 0:
return []
maxLeft, maxUp = 0, 0
maxRight, maxDown = len(matrix[0])-1, len(matrix)-1
# 向右是0,向下是1,向左是2,向上是3,正好0123四次转一圈
direction = 0
res = []
while True:
if direction == 0: #go right
for i in range(maxLeft, maxRight+1):
res.append(matrix[maxUp][i])
maxUp += 1
elif direction == 1: #go down
for i in range(maxUp, maxDown+1):
res.append(matrix[i][maxRight])
maxRight -= 1
elif direction == 2: #go left
for i in range(maxRight, maxLeft-1, -1):
res.append(matrix[maxDown][i])
maxDown -= 1
else: #go up
for i in range(maxDown, maxUp-1, -1):
res.append(matrix[i][maxLeft])
maxLeft += 1
if maxUp > maxDown or maxLeft > maxRight:
return res
direction = (direction + 1) % 4
return res
第二种方法:这个思路就是模拟魔方逆时针旋转的操作,一直取出的是第一行。取出第一行后,逆时针旋转矩阵,再取出第一行,一直这么做,直到矩阵为空,调出循环。我对zip的理解:zip是取出最小的单位,组成一个新的;zip(*) 是从最小的单位中取出元素,组成一个新的。然后用list将元组组成列表。
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix:
return []
result = []
while matrix:
result.extend(matrix[0])
matrix = matrix[1:]
matrix = map(list, zip(*matrix))[::-1]
return result