本文目录
- 1 中文题目
- 2 求解方法:数学模拟
- 2.1 方法思路
- 2.2 Python代码
- 2.3 复杂度分析
- 3 题目总结
1 中文题目
给定一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序
,返回矩阵中的所有元素。
示例:
提示:
- 1 ≤ m a t r i x . l e n g t h , m a t r i x [ i ] . l e n g t h ≤ 10 1 \leq matrix.length, matrix[i].length \leq 10 1≤matrix.length,matrix[i].length≤10
- − 100 ≤ m a t r i x [ i ] [ j ] ≤ 100 -100 \leq matrix[i][j] \leq 100 −100≤matrix[i][j]≤100
2 求解方法:数学模拟
2.1 方法思路
方法核心
使用四个指针分别表示矩阵的上下左右边界,按照顺时针方向遍历矩阵边界元素,每遍历完一圈后向内收缩边界继续遍历,直到所有元素都被遍历完成,整个过程只需要一次遍历就能完成矩阵的螺旋序列输出。
实现步骤
(1)初始化阶段:
- 定义四个边界变量:left、right、top、bottom
- 创建结果列表用于存储遍历顺序
- 检查矩阵是否为空
(2)遍历过程:
- 按照顺时针方向依次遍历四条边
- 每完成一圈遍历后收缩边界
- 直到边界交叉或重合为止
(3)边界处理:
- 遍历上边界时从左到右
- 遍历右边界时从上到下
- 遍历下边界时从右到左
- 遍历左边界时从下到上
(4)收缩规则:
- 完成一圈遍历后
- 左边界向右移动
- 右边界向左移动
- 上边界向下移动
- 下边界向上移动
方法示例
以 matrix = [[1,2,3],[4,5,6],[7,8,9]]
为例:
初始状态:
left = 0, right = 2
top = 0, bottom = 2
result = []
第一圈遍历:
1. 上边界:[1,2,3]
result = [1,2,3]
2. 右边界:[6,9]
result = [1,2,3,6,9]
3. 下边界:[8,7]
result = [1,2,3,6,9,8,7]
4. 左边界:[4]
result = [1,2,3,6,9,8,7,4]
边界收缩:
left = 1, right = 1
top = 1, bottom = 1
第二圈遍历:
1. 只剩中心点 5
result = [1,2,3,6,9,8,7,4,5]
遍历完成,返回结果
2.2 Python代码
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 如果矩阵为空,直接返回空列表
if not matrix:
return []
# 定义结果列表
result = []
# 定义四个边界
left, right = 0, len(matrix[0]) - 1 # 左右边界
top, bottom = 0, len(matrix) - 1 # 上下边界
# 当边界合法时继续遍历
while left <= right and top <= bottom:
# 1. 从左到右遍历上边界
for col in range(left, right + 1):
result.append(matrix[top][col])
# 2. 从上到下遍历右边界
for row in range(top + 1, bottom + 1):
result.append(matrix[row][right])
# 如果上下边界或左右边界重合,说明已经遍历完成
if left < right and top < bottom:
# 3. 从右到左遍历下边界
for col in range(right - 1, left - 1, -1):
result.append(matrix[bottom][col])
# 4. 从下到上遍历左边界
for row in range(bottom - 1, top, -1):
result.append(matrix[row][left])
# 缩小边界
left += 1
right -= 1
top += 1
bottom -= 1
return result
2.3 复杂度分析
- 时间复杂度:O(m*n),m 和 n 分别是矩阵的行数和列数
- 每个元素只被访问一次
- 没有重复访问的元素
- 空间复杂度:O(1)
- 只使用了固定数量的变量
3 题目总结
题目难度:中等
数据结构:矩阵
应用算法:四指针、数学模拟