题目

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

1
2
3
4
5
6
7
输入:
[
[ 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
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

题解

思路

螺旋矩阵按照一层一层的角度来看,每上下左右看作一轮。

+ 首先算出总共多少轮,记作level

  • 每一level进行上下左右四次循环
  • 注意处理最后一层循环避免重复
    难点在于四次循环的条件范围和最后一层的处理。

代码

C++ 实现

执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗 :8.5 MB, 在所有 C++ 提交中击败了83.07%的用户

感觉像是LeetCode出错了,怎么可能这么高?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if len(matrix) == 0:
return []
a = []
M = len(matrix)
N = len(matrix[0])
levels = (N+1)//2 if M > N else (M+1)//2;
for i in range(levels):
for j in range(i,N - i):
a.append(matrix[i][j])
for j in range(i + 1,M - i):
a.append(matrix[j][N - i - 1])
for j in range(N-i-2,i-1,-1):
if M - i -1 == i:
break
a.append(matrix[M - i - 1][j])
for j in range(M-i-2,i,-1):
if N - i -1 == i:
break
a.append(matrix[j][i])
return a;

Python3 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if len(matrix) == 0:
return []
a = []
M = len(matrix)
N = len(matrix[0])
levels = (N+1)//2 if M > N else (M+1)//2;
for i in range(levels):
for j in range(i,N - i):
a.append(matrix[i][j])
for j in range(i + 1,M - i):
a.append(matrix[j][N - i - 1])
for j in range(N-i-2,i-1,-1):
if M - i -1 == i:
break
a.append(matrix[M - i - 1][j])
for j in range(M-i-2,i,-1):
if N - i -1 == i:
break
a.append(matrix[j][i])
return a;