【面试题29 顺时针打印矩阵】
难度: 简单
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
Leetcode题目对应位置: 面试题29:顺时针打印矩阵
设置 4 个边界:top,bottom,left,right,用以限制当前遍历的最大范围。遍历顺序按照:从左到右,从上到下,从右到左,从下到上的顺序。
时间复杂度:O(mn),m 和 n 分别为矩阵的行数和列数
空间复杂度:O(1),存储新的遍历顺序
class Solution:
def spiralOrder(self, matrix:[[int]]) -> [int]:
if not matrix: return []
l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
while True:
for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
t += 1
if t > b: break
for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r: break
for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
b -= 1
if t > b: break
for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
l += 1
if l > r: break
return res
代码来源:mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di
将矩阵第一行的元素添加到 res 列表里,删除第一行(也就是 matrix 中的第一个列表),然后逆时针旋转(这里通过转置+倒序实现),新的 matrix 的第一行即为接下来要打印的元素。
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
代码来源:shan-chu-di-yi-xing-ni-shi-zhen-xuan-zhuan-python5