题目:
leetcode第54题--螺旋矩阵
要求:
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路:
分析本题,可以将过程分为4个过程,分别为向右、向下、向左、向上。碰到边界或者已经走过的行或列改变方向,一直重复这个过程直到走完全部。因此可以新建一个记录是否走过该位置的表,通过查询这个位置表改变行走方向。因此本代码先建立位置表,定义四个过程,然后一直重复走下去。
程序:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res; //用来保存结果
//处理单行或者单列或者空组的情况
int h = matrix.size();
if(h==0) return res;
int l = matrix[0].size();
if(h==1){
for(int o = 0;o < l;o ++){
res.push_back(matrix[0][o]);
}
return res;
}
if(l==1){
for(int o = 0;o < h;o ++){
res.push_back(matrix[o][0]);
}
return res;
}
//使用step变量表示需要走的过程,1代表想做,2代表向下,3代表向左,4代表向上
int step = 1;
int i = 0, j = 0;
//新建位置表
vector<int> flag_j;
int m = 0;
while(m < l){
m++;
flag_j.push_back(0);
}
vector<vector<int>> flag;
int k = 0;
while(k<h){
k++;
flag.push_back(flag_j);
}
//根据位置表进行行走
while(flag[i][j]==0){
res.push_back(matrix[i][j]);
flag[i][j] = 1;
switch(step){
case 1:{
j++;
if(j>=l||flag[i][j]==1){
step = 2;
j--;
i++;
}
break;
}
case 2:{
i++;
if(i>=h||flag[i][j]==1){
step = 3;
i--;
j--;
}
break;
}
case 3:{
j--;
if(j<0||flag[i][j]==1){
step = 4;
j++;
i--;
}
break;
}
case 4:{
i--;
if(i<0||flag[i][j]==1){
step = 1;
i++;
j++;
}
break;
}
}
}
return res;
}
结果:
最终结果尽然显示超过100%用户,用时0ms,可能这个计算不太准,仅供参考。