一、题目介绍
给定一个包含 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]
二、解题思路
由于螺旋矩阵是顺时针访问二维数组,所以可以总结以下几个方面的特点:
(1)首先定义,从左到右为x轴正向,从上到下为y轴正向。
(2)螺旋访问二维数组的过程可以拆分出四个步骤,第一沿着x轴正向遍历到列的最大位置xMax,之后行的最小位置yMin加1;第二沿着y轴正向遍历到行的最大位置yMax,之后列的最大位置xMax减1;第三沿着x轴负向遍历到列的最小位置xMin,之后行的最大位置yMax减1;第四沿着y轴负向遍历到行的最小位置yMin,之后列的最小位置xMin加1。按照上面的规则继续循环下去。
(3)循环的结束标志,当yMin > yMax 或者 xMin > xMax时,循环结束。
三、解题代码
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> vec;
int m = matrix.size();
if(!m)
return vec;
int n = matrix[0].size();
if(!n)
return vec;
int xMax = n-1;
int xMin = 0;
int yMax = m-1;
int yMin = 0;
while(1)
{
for(int i = xMin; i <= xMax; ++i)
{
vec.push_back(matrix[yMin][i]);
}
++yMin;
if(yMin > yMax)
break;
for(int i = yMin; i <= yMax; ++i)
{
vec.push_back(matrix[i][xMax]);
}
--xMax;
if(xMin > xMax)
break;
for(int i = xMax; i >= xMin; --i)
{
vec.push_back(matrix[yMax][i]);
}
--yMax;
if(yMin > yMax)
break;
for(int i = yMax; i >= yMin; --i)
{
vec.push_back(matrix[i][xMin]);
}
++xMin;
if(xMin > xMax)
break;
}
return vec;
}