前言:剑指offer刷题系列
问题:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例:
markdown
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
思路:
看到这个题目我首先想的是手动模拟,每次按一个方向输出数字,直到这个方向输出到头,就按顺时针方向从另一个方向开始输出,直到矩阵中所有数字都输出完毕。
首先判断一下,如果输入的 matrix
为空,则返回一个空列表。
然后按照螺旋顺序遍历给定的二维矩阵。具体来说,通过创建一个新的扩展矩阵 re_matrix
来实现。新矩阵的大小比原矩阵的大小多两行两列,并将原矩阵中的元素复制到新矩阵中对应的位置。然后,使用变量 i
和 j
来追踪当前遍历到的位置,并使用变量 flag
来表示当前遍历的方向。
在遍历过程中,首先将当前位置的元素添加到结果列表 res
中,并将新矩阵中对应位置的元素设置为 '0'
。然后根据当前遍历方向和新矩阵中相邻位置的元素值来更新遍历方向。最后,根据更新后的遍历方向更新变量 i
和 j
的值,以便进行下一次遍历。
最终,当结果列表 res
的长度达到原矩阵中所有元素的数量时,即完成了整个螺旋遍历过程,并返回结果列表。
时间复杂度:O(m*n)
空间复杂度:O(m*n)
基于上述思考,代码如下:
python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
i, j = 1, 1
m = len(matrix)
n = len(matrix[0])
re_matrix = [['0'] * (n + 2) for _ in range(m + 2)]
for x in range(1, m + 1):
for y in range(1, n + 1):
re_matrix[x][y] = matrix[x - 1][y - 1]
res = []
flag = 0
while len(res) < m*n:
res.append(re_matrix[i][j])
re_matrix[i][j] = '0'
if flag ==0 and re_matrix[i][j + 1] == '0':
flag = 1
if flag == 1 and re_matrix[i + 1][j] == '0':
flag = 2
if flag ==2 and re_matrix[i][j - 1] == '0':
flag = 3
if flag ==3 and re_matrix[i - 1][j] == '0':
flag = 0
if flag == 0:
j += 1
if flag == 1:
i += 1
if flag == 2:
j -= 1
if flag == 3:
i -= 1
return res