题目链接

题目描述

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例

示例1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]

提示

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

    思路

    模拟

    直接模拟就行,设四个指针 left, right, top, bottom,分别表示左右上下的边界,按顺时针遍历即可。
    值得注意的是,输入的矩阵可能不是方阵,因此要设置计数 totalNum 当其值变为0后,表示遍历结束。

    题解

    1. class Solution:
    2. def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    3. m, n = len(matrix), len(matrix[0])
    4. ret = []
    5. if not matrix or m == 0 or n == 0:
    6. return ret
    7. left, right = 0, n - 1
    8. top, bottom = 0, m - 1
    9. totalNum = m * n
    10. while totalNum > 0:
    11. for i in range(left, right + 1):
    12. if totalNum == 0:
    13. break
    14. ret.append(matrix[top][i])
    15. totalNum -= 1
    16. top += 1
    17. for i in range(top, bottom + 1):
    18. if totalNum == 0:
    19. break
    20. ret.append(matrix[i][right])
    21. totalNum -= 1
    22. right -= 1
    23. for i in range(right, left - 1, -1):
    24. if totalNum == 0:
    25. break
    26. ret.append(matrix[bottom][i])
    27. totalNum -= 1
    28. bottom -= 1
    29. for i in range(bottom, top - 1, -1):
    30. if totalNum == 0:
    31. break
    32. ret.append(matrix[i][left])
    33. totalNum -= 1
    34. left += 1
    35. return ret

    复杂度分析

  • 时间复杂度:0054-螺旋矩阵 - 图1

  • 空间复杂度:0054-螺旋矩阵 - 图2