思路一
(常规):第一种方法是弹出第一行记入结果矩阵,然后将矩阵逆时针翻转90度,再弹出翻转后矩阵的第一行。如此循环执行以上两步,直到矩阵为空,如下图所示。**
也可参见剑指offer记录第30题,一样的题目
代码
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
row = len(matrix)
col = len(matrix[0])
res = []
tmp = []
res.extend(matrix.pop(0))
#对矩阵进行翻转
while matrix:
#时刻更新行、列数
row = len(matrix)
col = len(matrix[0])
tmp = []
for i in range(col-1,-1,-1):
tmp2 = []
for j in range(row):
tmp2.append(matrix[j][i])
tmp.append(tmp2)
matrix = tmp
res.extend(matrix.pop(0))
return res
思路二:
将已经走过的地方置0,然后判断下一步是不是已经走过了,如果走过了就计算一下新的方向,拐弯:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
#di,di代表行和列的前进方向,首先取第一行,即列j进行变化
res,i,j,di,dj = [],0,0,0,1
for _ in range(len(matrix) * len(matrix[0])):
res.append(matrix[i][j])
matrix[i][j] = 0 #走过的地方置0
#进行判断,下一步是否已经走过(即是否为0),因为可能会越界,所以要取余数
if matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])] == 0:
di,dj = dj,-di #走过就拐弯(这里可用矩阵模拟一下,就可以归纳出这样的规律)
i += di
j += dj
return res