题目描述
Given an integer n, generate a square matrix filled with elements from 1 to n 2 in spiral order.
For example,
Given n =3,
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路:这道题和Spiral Matrix的模型和解法一样。要求我们将1~n^2的数字螺旋写入矩阵中。我们依然维护四个变量,rowBegin, rowEnd, colBegin, colEnd。然后去界定螺旋的边界。我们需要注意的是,如果n 为0,我们应该返回空的数组。并且在写入数字时,我们也需要判断目前的数字是否超过最大数字N^2,如果超过,说明我们不需要遍历了。还有最重要的一点,数组在未初始化时,是不允许使用下标操作符来改变数组元素的,所以我们一定要先初始化数组,这里初始化为N行N列,元素都为0的数组。
二维vector容器存放一个矩阵是可以的,它与数组的存放形式是完全一样的。
写入与读取是一样的!!!
不需要考虑重复的情况了,因为是方阵!!!
实现代码:
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
if(n==0) return vector<vector<int>> ();
vector<vector<int>> ret(n,vector<int>(n,0));
int rowbegin=0;
int rowend=n-1;
int colbegin=0;
int colend=n-1;
int num=1;
while(rowbegin<=rowend && colbegin<=colend)
{
if(num<=n*n)
{
//向右遍历;
for(int i=colbegin;i<=colend;i++)
{
ret[rowbegin][i]=num;
num++;
}
}
rowbegin++;
if(num<=n*n)
{
//向下遍历;
for(int i=rowbegin;i<=rowend;i++)
{
ret[i][colend]=num;
num++;
}
}
colend--;
if(num<=n*n)
{
//向左遍历;
for(int i=colend;i>=colbegin;i--)
{
ret[rowend][i]=num;
num++;
}
}
rowend--;
if(num<=n*n)
{
//向上遍历;
for(int i=rowend;i>=rowbegin;i--)
{
ret[i][colbegin]=num;
num++;
}
}
colbegin++;
}
return ret;
}
};