题:https://leetcode.com/problems/spiral-matrix/description/
题目
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]
思路
题目大意
从外围向中心,每圈顺时针遍历。
解题思路
1.顺时针遍历
分为两步,1.从外围到中心。2.确定要遍历矩形的坐标。
从外围到中心,表现为起始位置发生了变化。通过观察可以发现 其实位置为(start_p,start_p) ,其中start_p的取值从 0 –> (min(m,n)+1)//2 。
确定遍历的矩形。起始坐标为(start_p,start_p),边界为(m - 2*start_p,n - 2*start_p)。然后矩形上部,右部,下部,左部。其中遍历下部和左部前应该分辨判断 m - 2*start_p>1 ,n - 2*start_p>1。因为若该矩形只有一行,那 下部 和 上部 是有重复的,矩形的列也会出现这样的问题。
2.旋转矩形
|1 2 3| |6 9| |8 7| |4| => |5| => ||
|4 5 6| => |5 8| => |5 4| => |5|
|7 8 9| |4 7|
题目要求的遍历过程也可以视为,将矩阵第一行遍历后,将剩下的矩形左旋转180度。然后重复上述过程,直到矩形为空。
参考资料:https://leetcode.com/problems/spiral-matrix/discuss/20571/1-liner-in-Python-+-Ruby
python 能用一行来实现上述操作。
def spiralOrder(self, matrix):
return matrix and [*matrix.pop(0)] + self.spiralOrder([*zip(*matrix)][::-1])
matrix :是判断 矩阵是否为空。
[*matrix.pop(0)]:pop操作是从最高维弹出,由于matrix是二维,所以弹出一个一维数组 。 星号能将 list,reduce降维。
[*zip(*matrix)][::-1]:zip可以实现将 list表示的 矩阵 转置。这个操作很难想到。再用[::-1] 调整举证列排序最终实现 将矩阵旋转 180度。
note:
星号 的 用法共有四种,参考:https://blog.csdn.net/yilovexing/article/details/80577510
code
1.顺时针遍历
class Solution:
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
self.res = []
m = len(matrix)
if m == 0:
return self.res
n = len(matrix[0])
halfOfMinRadius_matrix = (min(m, n) + 1 )// 2
for k in range(halfOfMinRadius_matrix):
self.visitedRectangle(k, k, m - 2 * k, n - 2 * k, matrix)
return self.res
def visitedRectangle(self, start_row, start_col, m, n, matrix):
for j in range(n):
self.res.append(matrix[start_row][start_col + j])
for i in range(1,m):
self.res.append(matrix[start_row + i][start_col + n - 1])
if m>1:
for j in range(n - 2, -1, -1):
self.res.append(matrix[start_row + m - 1][start_col + j])
if n>1:
for i in range(m - 2, 0, -1):
self.res.append(matrix[start_row + i][start_col])
2.旋转矩形
class Solution:
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
return matrix and [*matrix.pop(0)] + self.spiralOrder([*zip(*matrix)][::-1])