59. 螺旋矩阵 II
给你一个正整数 ,生成一个包含 到 所有元素,且元素按顺时针顺序螺旋排列的 正方形矩阵 。n
1
n2
n x n
matrix
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
思路:
1、需要跟据给定的正整数n,判断需要打印几圈
2、由于是按顺时针顺序打印螺旋矩阵,用二维数组保存输出,C++中用vector容器中嵌套vector容器达到构成二维数组
如:vector<vector<int>>res(n,vector<int>(n,0));
vector容器嵌套的使用
void test01() {
vector< vector<int> > v;
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
for (int i = 0; i < 4; i++) {
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//将容器元素插入到vector v中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
cout << *vit << " ";
}
cout << endl;
}
}
3、需要每一圈,按照4条边依次进行打印,则需要判断每条边的边界问题,可以用四个for循环进行每条边的打印。再通过while循环进行每个圈的打印。
4、当给定的n为奇数则不够整数圈(有4条边的为一圈),需要单独给最中间的空格进行赋值,最后输出容器嵌套容器res即可
最终解题代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n,vector<int>(n,0));
int startx=0,starty=0;
int loop=n/2;
int mid=n/2;
int count=1;
int offset=1;
int i,j;
while(loop--){
i=startx;
j=starty;
for(j=starty;j<n-offset;j++)
{
res[startx][j]=count++;
}
for(i=startx;i<n-offset;i++)
{
res[i][j]=count++;
}
for(;j>starty;j--)
{
res[i][j]=count++;
}
for(;i>startx;i--)
{
res[i][j]=count++;
}
startx++;
starty++;
offset+=1;
}
if(n%2)
{
res[mid][mid]=count;
}
return res;
}
};