螺旋矩阵Ⅱ
先修知识点
vector变量的初始化:
- vector<int> a(10) ; //声明一个初始大小为10的向量。一维向量
- vector<int> a(10, 1) ; //声明一个初始大小为10且初始值都为1的向量 。一维向量
- vector<vector<int>> b(10, vector<int>(5)); //创建一个10*5的int型二维向量
- 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector<int>::iterator
问题描述
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。如:若矩阵为3x3方阵,那么返回:
[ [ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ] ]
解题思路
按照螺旋顺序写矩阵,规定a,b为行坐标(a为起始,b为终止);c、d为纵坐标(c为起始,d为终止)
首先写第一行(坐标为[a][i]):位置从c—d;然后是最后一排(坐标为[i][d]):位置从a+1—b;之后是最下面一行(坐标为[b][i]):位置从d-1—c;最后是第一列(坐标是[c][i]):位置从b-1—a+1。在最后一列算完开始算下一圈的时候,c是从c+1开始的,因此需要添加c++。
第二轮是在第一轮的基础上进行的,因此进行循环。
第一行之后,行的开始a++;
最后一列之后,列的终结d--;
最后一行之后,行的终结b--;
第一列之后,列的开始c++。
class Solution {
public:
vector<vector<int>> generateMatrix(int n)
{
vector<vector<int>> M(n,vector<int>(n,0));
int num=1;
int a=0,b=n-1,c=0,d=n-1;
while(num<=n*n)
{
for(int i=c;i<=d;i++)
{
M[a][i]=num;
num++;
}
a++;
for(int i=a;i<=b;i++)
{
M[i][d]=num;
num++;
}
d--;
for(int i=d;i>=c;i--)
{
M[b][i]=num;
num++;
}
b--;
for(int i=b;i>=a;i--)
{
M[i][c]=num;
num++;
}
c++;
}
return M;
}
};