题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
常规做法:
思路为:将矩阵的上t、下b、左l、右r四个边界用于打印的res列表,然后进行从左向右、从上到下、从右到左和从下到上的顺序进行循环(根据边界将元素按顺序添加到res列表的尾部,边界向内收缩1,判断边界是否相遇)
class Solution:
def spiralOrder(self,matrix:List[List[int]])->List[int]:
t,b,l,r,res=0,len(matrix)-1,0,len(matrix[0])-1,[]
if not matrix:
return []
while True:
if l>r:break
for i in range(l,r+1):
res.append(matrix[t][i])
t+=1
if t>b:break
for j in range(t,b+1):
res.append(matrix[j][r])
r-=1
if l>r:break
for k in range(r,l-1,-1):
res.append(matrix[b][k])
b -=1
if t>b:break
for m in range(b,t-1,-1):
res.append(matrix[m][l])
l+=1
if l>r:break
return res
大佬方法5行代码:
思路为:将矩阵第一行的元素添加到res列表里,删除第一行(也就是matrix中的第一个列表),然后逆时针旋转(通过转置+倒序实现),新的matrix的第一行即为接下来要打印的元素。巧妙用了zip函数。(我很佩服,但是面试的时候不是很推荐,因为我认为算法主要考的是思路,整个思考的过程)
class Solution:
def spiralOrder(self,matrix:List[List[int]])->List[int]:
res = []
while matrix:
res += matrix.pop(0)
matrix=list(zip(*matrix))[::-1]
return res