题目来源:
leetcode题目:54. 螺旋矩阵 - 力扣(LeetCode)
解题思路:
遍历以matrix[i][i] 为起点的长方形,记录经过的节点。注意以下两点:
1.不要在遍历长方形时重复遍历节点
2.当所给数组不为正方形时,注意 i 的取值范围,matrix[i][i] 可能已经遍历过了。
解题代码:
#python3
class Solution:
def getSize(m:int,n:int)->int:
m=m//2+1 if m&1==1 else m//2
n=n//2+1 if n&1==1 else n//2
return min(m,n)
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res=[]
m=len(matrix)
n=len(matrix[0])
size=Solution.getSize(m,n)
for i in range(size): #从 matrix[i][i]开始遍历
for j in range(i,n-i): #横向从左往右 [i][i]->[i][n-i-1]
res.append(matrix[i][j])
for j in range(i+1,m-i): #纵向从上到下 [i][n-i-1]->[n-i-1][n-i-1]
res.append(matrix[j][n-i-1])
if m-i-1!=i:
for j in range(n-i-2,i-1,-1): #横向从右到左[n-i-1][n-i-1]->[n-i-1][i]
res.append(matrix[m-i-1][j])
if n-i-1!=i:
for j in range(m-i-2,i,-1): #纵向从下到上 [n-i-1][i]->[i][i]
res.append(matrix[j][i])
return res
总结:
用方向数组+模拟可能会简单一点。
官方题解给出的就是这两种解法。不过他按层遍历时是记录上下左右四个节点,逐渐向内收缩。