No54.螺旋矩阵
题目
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例1
- 输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
] - 输出: [1,2,3,6,9,8,7,4,5]
示例2
- 输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
] - 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
解题代码(Python3)
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
def getCol(up,down,index,type=0):
data = matrix[up:down+1]
if type == 0:
return [x[index] for i,x in enumerate(data)]
return [x[index] for i,x in enumerate(data) if i != 0 and i !=len(data)-1]
#返回限定框的顺时针数据
def getRound(left,right,up,down):
if up == down:
return matrix[up][left:right+1]
if left == right:
return getCol(up,down,left)
return matrix[up][left:right+1] + getCol(up,down,right,1) + matrix[down][left:right+1][::-1] +getCol(up,down,left,1)[::-1]
m = len(matrix)
n = len(matrix[0])
left = up = 0
right = n - 1
down = m - 1
res = []
while len(res) < m * n:
res += getRound(left,right,up,down)
up += 1
down -= 1
left += 1
right -= 1
return res
思路:
把矩形想象成一个箱子,沿着外壳逐层脱掉外壳,辅助变量为left,right,up,down分别表示当前箱子的左右上下边界(闭区间),然后进行遍历依次存入名为res的List中,最后返回List。
复杂度分析:
- 时间复杂度O(nlogn) n代表的是自定义方法中使用了诸如
[::-1]
等切片访问操作,时间复杂度为O(n),外面的logn是因为整个外层循环的次数是对数级别的 - 空间复杂度O(1) 额外6个变量 常数级别