给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
分析
- 方向是有四个方向,转换的方式也是固定的,可以通过一个二维数组承载,然后用贪心的算法去试探下一个元素
- 判断元素是否合适,包括是否在边界内,还有是否已经遍历过了
- 判断是否已经遍历过了可以通过一个矩阵记录
- 还有个更加简洁方案,就是一直在交换
方案一
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 用另外一个矩阵记录走过的元素索引
# 用一个二维数组记录方向
m, n = len(matrix), len(matrix[0])
record_matrix = [[False for _ in range(n)] for _ in range(m)]
direction_list = [[0, 1], [1, 0], [0, -1], [-1, 0]]
res = [matrix[0][0]]
record_matrix[0][0] = True
i, j= 0, 0
direction_index = 0
while len(res) != m*n:
x, y = direction_list[direction_index % 4]
tmp_i, tmp_j = x + i, y + j
if tmp_i >= 0 and tmp_i < m and tmp_j >=0 and tmp_j < n and record_matrix[tmp_i][tmp_j] == False:
i, j = tmp_i, tmp_j
record_matrix[tmp_i][tmp_j] = True
res.append(matrix[i][j])
else:
direction_index += 1
return res
方案二
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
for i in range(n//2):
for j in range((n + 1)//2):
matrix[i][j], matrix[n - j - 1][i], matrix[n-i-1][n-j-1], matrix[j][n-i-1] \
= matrix[n-j-1][i], matrix[n-i-1][n - j- 1], matrix[j][n - i - 1], matrix[i][j]