54. 螺旋矩阵

题目描述

思路
实际上解决这道题目并不需要什么特别的思路,只需要按照题目的规则进行模拟即可。
具体来说,我们可以设置四个变量,分别表示当前我们遍历到的螺旋矩阵的子矩阵的起始行 / 终止行 / 起始列 / 终止列,我们将变量命名为u / d / l / r。此处仅举对第一行进行遍历的例子:当我们开始对第一行进行遍历时,实际上我们要遍历的是matrix[u][l...r]这个区间,将这个区间当中的数值都加入到答案的数组当中即可。在完成这一行的遍历之后,我们需要对子矩阵的范围进行调整,规则也非常的明显,那就是把表示矩阵上边界的变量u进行自增。边界条件是当u > d时,代表矩阵已经完成了遍历,此时对最外层循环进行break并返回答案即可。
对子矩阵的左右边界以及下边界进行遍历同理。
基于以上思路,我们来写代码解决问题。
Golang 题解
go
func spiralOrder(matrix [][]int) []int {
m, n := len(matrix), len(matrix[0])
l, r, u, d := 0, n - 1, 0, m - 1
ans := []int{}
for {
for i := l; i <= r; i ++ {
ans = append(ans, matrix[u][i])
}
u ++
if u > d {
break
}
for i := u; i <= d; i ++ {
ans = append(ans, matrix[i][r])
}
r --
if l > r {
break
}
for i := r; i >= l; i -- {
ans = append(ans, matrix[d][i])
}
d --
if u > d {
break
}
for i := d; i >= u; i -- {
ans = append(ans, matrix[i][l])
}
l ++
if l > r {
break
}
}
return ans
}
Python 题解
python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
l, r, u, d = 0, len(matrix[0]) - 1, 0, len(matrix) - 1
ans = []
while True:
i = l
while i <= r:
ans.append(matrix[u][i])
i += 1
u += 1
if u > d:
break
i = u
while i <= d:
ans.append(matrix[i][r])
i += 1
r -= 1
if l > r:
break
i = r
while i >= l:
ans.append(matrix[d][i])
i -= 1
d -= 1
if u > d:
break
i = d
while i >= u:
ans.append(matrix[i][l])
i -= 1
l += 1
if l > r:
break
return ans