给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行用时:12 m, 在所有 Python 提交中击败了92.76%的用户
内存消耗:12.9 MB, 在所有 Python 提交中击败了83.86%的用户
通过测试用例:25 / 25
class Solution:
def spiralOrder(self, matrix):
m,n,k = len(matrix), len(matrix[0]), 0
total = m * n
li = []
while len(li) <= total:
for i in range(k,n-k):
li.append(matrix[k][i])
if len(li) >= total:
break
for i in range(k+1,m-k):
li.append(matrix[i][n-k-1])
if len(li) >= total:
break
for i in range(n-k-2,k-1,-1):
li.append(matrix[m-k-1][i])
if len(li) >= total:
break
for i in range(m-k-2,k,-1):
li.append(matrix[i][k])
if len(li) >= total:
break
k += 1
return li
执行用时:16 ms, 在所有 Python 提交中击败了71.34%的用户
内存消耗:13 MB, 在所有 Python 提交中击败了69.68%的用户
通过测试用例:
25 / 25
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
lm, lmm = len(matrix),len(matrix[0])
total = lm*lmm
i,j = 0,0
visited = []
ni,nj = 0,1
# ni nj 方向
# 0 1 右
# 1 0 下
# 0 -1 左
# -1 0 上
while len(visited) < total:
# 添加元素
visited.append((i,j))
# 如果当前i或者j到达头尾部,则进行更换
if ((i+ni)%lm,(j+nj)%lmm) in visited:
ni,nj = nj,-ni
i += ni
j += nj
return [matrix[m][n] for m,n in visited]
执行用时:24 ms, 在所有 Python 提交中击败了12.37%的用户
内存消耗:13 MB, 在所有 Python 提交中击败了55.96%的用户
通过测试用例:25 / 25
–从力扣搬运的代码–
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
res = []
while matrix:
# 获取头行
res += matrix.pop(0)
# 旋转列表
matrix = zip(*matrix)[::-1]
return res