一、题目
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
示例1
[[1,2,3],[4,5,6],[7,8,9]]
[1,2,3,6,9,8,7,4,5]
二、题解
先考虑矩阵为方阵的情况(m==n),定义边界值:left,right,top,bottom,遍历方向(从左向右、从上向下、从右向左、从下向上)
然后考虑特殊情况,如矩阵为空,矩阵为以下两种case,需要加条件限定,否则输出结果不对
case1:
1? 2? ? 3? ? ?4
5? 6? ? 7? ? ?8
9? 10? 11? 12
case2:
1? ? 2? ? 3
5? ? 6? ? 7
9? ?10? 11?
13 14? 15
17 18? 19
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
int m = matrix.size();
int n = matrix[0].size();
if(m==0 || n==0) return res;//数组为空
int left = 0,right = n-1;
int top = 0,btm = m-1;
while(left<=right && top<=btm){
//从左往右遍历
for(int i=left;i<=right;i++){
res.push_back(matrix[top][i]);
}
//从上往下遍历
for(int j=top+1;j<=btm;j++){
res.push_back(matrix[j][right]);
}
//从右往左遍历
if(top < btm){//case:[[1,2,3,4],[5,6,7,8],[9,10,11,12]],不加if判断时输出[1,2,3,4,8,12,11,10,9,5,6,7,6],因为满足for的条件,执行循环体后,结果中多了个6
for(int k=right-1;k>=left;k--){
res.push_back(matrix[btm][k]);
}
}
//从下往上遍历
if(left < right){//case:[[1,2,3],[5,6,7],[9,10,11],[13,14,15],[17,18,19]],不加if判断时输出[1,2,3,7,11,15,19,18,17,13,9,5,6,10,14,10,14],因为满足for的条件,多输出10,14
for(int m=btm-1;m>top;m--){
res.push_back(matrix[m][left]);
}
}
top++;
btm--;
left++;
right--;
}
return res;
}
};
?