挺恶心的一道题。。而且出现频率挺高的。
0. 解法零
面试最好不要写这种,竞赛赶时间可以写一下。面试想让你写下面的两种
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
ans = []
while matrix:
ans.extend(matrix[0])
matrix = list(zip(*matrix[1:]))[::-1]
return ans
1. 解法一
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
i, j = 0, 0
w = len(matrix[0])
h = len(matrix)
ans = []
while i < (len(matrix)+1) // 2 and j < (len(matrix[0])+1)//2:
flag = 0
flag2 = 0
for _ in range(w - 1):
flag2 = 1
ans.append(matrix[i][j])
j += 1
for _ in range(h - 1):
flag = 1
ans.append(matrix[i][j])
i += 1
for _ in range(w - 1):
if not flag or not flag2:
break
ans.append(matrix[i][j])
j -= 1
for _ in range(h - 2):
if not flag or not flag2:
break
ans.append(matrix[i][j])
i -= 1
ans.append(matrix[i][j])
w -= 2
h -= 2
j += 1
# h += 1
return ans
2. 解法二
还有一种解法是递归。