螺旋矩阵(Spiral Matrix)题解
题目描述
给定一个 m x n的矩阵,按照螺旋顺序返回所有元素。
示例:
输入:
[[1,2,3],
[4,5,6],
[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
解题思路
使用边界收缩法,通过维护四个边界变量来模拟螺旋遍历过程:
top:上边界bottom:下边界left:左边界right:右边界
算法步骤:
- 初始化四个边界和剩余元素计数
- 按照右→下→左→上的顺序循环遍历
- 每完成一个方向,收缩对应边界
- 当所有元素都被处理时结束循环
代码实现
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<vector<int>> matrix = {{1,2,3},{4,5,6},{7,8,9}};
int m=matrix.size();
int n=matrix[0].size();
int nums=m*n;
vector<int> result;
int left=0,right=n-1,top=0,bottom=m-1;
while(nums--){
//向右
for(int i=left;i<=right&&nums>=0;i++){
result.push_back(matrix[top][i]);
}
top++;
//向下
for(int i=top;i<=bottom&&nums>=0;i++){
result.push_back(matrix[i][right]);
}
right--;
//向左
for(int i=right;i>=left&&nums>=0;i--){
result.push_back(matrix[bottom][i]);
}
bottom--;
//向上
for(int i=bottom;i>=top&&nums>=0;i--){
result.push_back(matrix[i][left]);
}
left++;
}
for(int i=0;i<result.size();i++){
cout<<result[i]<<" ";
}
}
执行过程演示
以 3x3矩阵为例:
初始状态:
- 边界:top=0, bottom=2, left=0, right=2
- 剩余元素:9
第一轮:
- 向右:遍历(0,0)→(0,1)→(0,2),输出[1,2,3],剩余6元素
- 向下:遍历(1,2)→(2,2),输出[6,9],剩余4元素
- 向左:遍历(2,1)→(2,0),输出[8,7],剩余2元素
- 向上:遍历(1,0),输出[4],剩余1元素
第二轮:
- 向右:遍历(1,1),输出[5],剩余0元素
最终输出:[1,2,3,6,9,8,7,4,5]
关键特性
- 边界检查:每个循环都检查
nums > 0,防止重复处理 - 对称收缩:每次完成一个方向后收缩对应边界
- 顺序固定:始终按照右→下→左→上的顺序
复杂度分析
- 时间复杂度:O(m × n),每个元素只访问一次
- 空间复杂度:O(1),只使用常数个额外变量(输出数组不计入)