rows, columns = len(matrix), len(matrix[0]) order = list() left, right, top, bottom = 0, columns - 1, 0, rows - 1 while left <= right and top <= bottom: for column inrange(left, right + 1): order.append(matrix[top][column]) for row inrange(top + 1, bottom + 1): order.append(matrix[row][right]) if left < right and top < bottom: for column inrange(right - 1, left, -1): order.append(matrix[bottom][column]) for row inrange(bottom, top, -1): order.append(matrix[row][left]) left, right, top, bottom = left + 1, right - 1, top + 1, bottom - 1 return order
复杂度分析
时间复杂度:,其中 m 和 n
分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。
空间复杂度:。除了输出数组以外,空间复杂度是常数。
Approach 3: 利用zip的简洁代码
1 2 3 4 5 6 7 8 9
classSolution: defspiralOrder(self, matrix: List[List[int]]) -> List[int]: res = [] while matrix: # 移除第一行并返回移除元素 res += matrix.pop(0) # zip(*Array) 可理解为解压,返回二维矩阵,把每一列打包 matrix = list(zip(*matrix))[::-1] return res
复杂度分析
时间复杂度:,其中
N 是 m 和 n 中最大值,调用 p 次zip()。因为函数调用时间复杂度是O(N)