由外向里,一层一层的输出
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty()) return res;
//top,bottom,left,right分别是当前层的上下左右边界
int top=0,bottom=matrix.size()-1,left=0,right=matrix[0].size()-1;
while(left<=right && top<=bottom){
for(int j=left;j<=right;++j) res.push_back(matrix[top][j]);//遍历top行
for(int i=top+1;i<=bottom;++i) res.push_back(matrix[i][right]);//遍历right列
//如果最后一层不是多行多列,就只需要执行前面2步即可
if(left<right && top<bottom){
for(int j=right-1;j>left;--j) res.push_back(matrix[bottom][j]);//遍历bottom行
for(int i=bottom;i>top;--i) res.push_back(matrix[i][left]);//遍历left列
}
//当前层遍历完毕后,就往内缩一圈
++top;
--bottom;
++left;
--right;
}
return res;
}