Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路:
1.一圈一圈地进行遍历,每一圈在遍历的时候分为四条边,每条边的最后一个数在遍历下一条边的时候作为第一个数进行遍历。
2.圈数的计算,取行数和列数中较小的值的一半
3.最后一圈的处理方式,即最后长或者宽为1的矩形的处理,由于在遍历的时候,取得是每条边最后一个数不遍历,那么,如果最后一圈也用循环内的遍历方式进行遍历,必然有端点的位置存在问题,所以另做处理。根据m和n的大小先判断是长为0,还是宽为0,然后直接将最后一行(列)读出。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>result;
if(matrix.size()==0||matrix[0].size()==0)
return result;
int m=matrix.size(),n=matrix[0].size(),cnt=0,sum,len;
int i,j,wide,high,d;
sum=m*n;
len=min(m,n)/2;
result.resize(sum);
for(d=0;d<len;d++){
i=d;wide=n-d-1;high=m-d-1;
for(j=d;j<wide;j++)
result[cnt++]=matrix[i][j];
for(;i<high;i++)
result[cnt++]=matrix[i][j];
for(;j>d;--j)
result[cnt++]=matrix[i][j];
for(;i>d;--i)
result[cnt++]=matrix[i][j];
}
i=d;j=d;
if(m>=n)
while(cnt<sum)
result[cnt++]=matrix[i++][j];
else
while(cnt<sum)
result[cnt++]=matrix[i][j++];
return result;
}
};