题目描述:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
Tags: Array
分析:
由之前的Rotate Image(http://blog.csdn.net/bu_min/article/details/45749429)题目的启示,本题可以通过一层一层往里剥,但是怎么获取每次打印的下标呢?
暴力法:处理每一层的时候,记录四边形对角两个节点的行列号,这就把这一层的行列坐标范围给记住了,每一层处理完之后,将对角节点坐标更新,往里挪一层。
此题陷阱有点多:
1、需要注意,此题的矩阵式M x N,行数和列数不一样,因此求层数的范围时候,应该用min(M,N)来计算。
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
Tags: Array
分析:
由之前的Rotate Image(http://blog.csdn.net/bu_min/article/details/45749429)题目的启示,本题可以通过一层一层往里剥,但是怎么获取每次打印的下标呢?
暴力法:处理每一层的时候,记录四边形对角两个节点的行列号,这就把这一层的行列坐标范围给记住了,每一层处理完之后,将对角节点坐标更新,往里挪一层。
此题陷阱有点多:
1、需要注意,此题的矩阵式M x N,行数和列数不一样,因此求层数的范围时候,应该用min(M,N)来计算。
2、在;螺旋顺序打印的时候,注意下标处理,当M>N时,最后两个标记节点的行坐标相等;若M<N,最后两个标记节点的列坐标相等,应单独处理这两个情况。
以下是C++实现代码,附注释。
/*2ms//*/
class Solution {
public:
struct node /**定义node结构,用于存储每一层的两个对角节点*/
{
int x;
int y;
node(int _x,int _y):x(_x),y(_y){}
};
int min(int m,int n)
{
return m < n? m : n;
}
vector<int> spiralOrder(vector<vector<int>>& m) {
vector<int> vec;
if(m.empty())
return vec;
int m_size = m.size();
int n_size = m[0].size();
node up(0,0);
node down(m_size-1,n_size-1);
int lay = min(m_size,n_size)/2;
while(lay--) /*循环处理每一层*/
{
for(int j = up.y;j<down.y;j++) /*从左到右处理上边*/
{
vec.push_back(m[up.x][j]);
}
for(int i = up.x;i < down.x;i++) /*从上到下处理右边*/
{
vec.push_back(m[i][down.y]);
}
for(int j = down.y;j >up.y;j--) /*从右到左处理下边*/
{
vec.push_back(m[down.x][j]);
}
for(int i = down.x;i > up.x;i--) /*从下到上处理左边*/
{
vec.push_back(m[i][up.y]);
}
/*更新对角节点*/
up.x++;
up.y++;
down.x--;
down.y--;
}
if(up.y == down.y) /*处理M>N的情况*/
{
for(int i = up.x;i <= down.x;i++)
{
vec.push_back(m[i][up.y]);
}
}
else if(up.x == down.x) /*处理M<N的情况*/
{
for(int j = up.y; j <= down.y; j++)
{
vec.push_back(m[up.x][j]);
}
}
return vec;
}
};